- 查看: 906
- 回复: 1
背景
我开发的一个插件BedrockPlayerSupport恰好需要自动更新配置文件而不丢失已有设置这个功能,所以就写了一个相关代码,供大家参考
思路
一个完美的自动更新配置文件:
特别需要注意的是: 在设置value的时候一定要检测key是否为 config-version,并且检测key的类型是否为MemorySection,如果其中一个为是则不设置
如果key为config-version,设置后会导致配置文件版本号不更新
如果key的类型为MemorySection,设置后会导致更新失败(因为设置了MemorySection内容相当于把旧的配置文件全部key覆盖回来了,相当于没有更新)
别忘记在配置文件中添加配置文件版本号选项( config-version ),你可以把内容写成变量 ${project.version} ,这个变量在构建时会自动替换为当前项目的版本,所以只需要在每次更新时修改pom.xml的版本号即可自动更新配置文件版本号
示例代码和配置文件
下面是按照这个思路写的示例代码:
对应的配置文件:
我开发的一个插件BedrockPlayerSupport恰好需要自动更新配置文件而不丢失已有设置这个功能,所以就写了一个相关代码,供大家参考
思路
一个完美的自动更新配置文件:
- 服主更新插件重启服务器后插件自动更新配置文件
- 自动更新配置文件不会丢失之前设置的数据
- 新增的原有的配置选项注释要保留
- 运行插件时检测是否已经存在配置文件,若存在,则说明用户不是第一次运行,检查配置文件版本
- 对比配置文件的版本号和插件内打包的配置文件版本号是否相同
- 若版本号不相同,则说明配置文件需要更新(降版本也会触发,但是有人会降版本使用吗
)
- 将旧的配置文件 (config.yml) 重命名为 old_config.yml,并生成新的 config.yml
- 读取旧的配置文件,遍历key,获取对应的值,然后设置新的配置文件,完成后保存文件
- 重新检测配置文件版本号,如果和插件内的配置文件版本号相同,说明更新成功
特别需要注意的是: 在设置value的时候一定要检测key是否为 config-version,并且检测key的类型是否为MemorySection,如果其中一个为是则不设置
如果key为config-version,设置后会导致配置文件版本号不更新
如果key的类型为MemorySection,设置后会导致更新失败(因为设置了MemorySection内容相当于把旧的配置文件全部key覆盖回来了,相当于没有更新)
别忘记在配置文件中添加配置文件版本号选项( config-version ),你可以把内容写成变量 ${project.version} ,这个变量在构建时会自动替换为当前项目的版本,所以只需要在每次更新时修改pom.xml的版本号即可自动更新配置文件版本号
代码:
# 配置文件版本 (请不要自己修改该值!!!)
config-version: ${project.version}
示例代码和配置文件
下面是按照这个思路写的示例代码:
Java:
public static void updateConfig() {
File configFile = new File(BedrockPlayerSupport.getInstance().getDataFolder(), "/config.yml");
YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile);
if (!config.getString("config-version").equals(BedrockPlayerSupport.getInstance().getDescription().getVersion())) {
BedrockPlayerSupport.getInstance().getLogger().info("正在更新配置文件到最新版本(当前版本: {nowVersion} 内置版本: {latestVersion})"
.replace("{nowVersion}", config.getString("config-version"))
.replace("{latestVersion}", BedrockPlayerSupport.getInstance().getDescription().getVersion()));
File oldConfigFile = new File(BedrockPlayerSupport.getInstance().getDataFolder(), "/old_config.yml");
if (oldConfigFile.exists()) {
oldConfigFile.delete();
}
if (configFile.renameTo(oldConfigFile)) {
BedrockPlayerSupport.getInstance().saveResource("config.yml", false);
config = YamlConfiguration.loadConfiguration(configFile);
YamlConfiguration oldConfig = YamlConfiguration.loadConfiguration(oldConfigFile);
for (String key : oldConfig.getKeys(true)) {
if (!"config-version".equalsIgnoreCase(key) && oldConfig.get(key).getClass() != MemorySection.class) {
config.set(key, oldConfig.get(key));
}
}
try {
config.save(configFile);
config = YamlConfiguration.loadConfiguration(configFile);
if (config.getString("config-version").equals(BedrockPlayerSupport.getInstance().getDescription().getVersion())) {
BedrockPlayerSupport.getInstance().getLogger().info("成功更新配置文件");
}
} catch (IOException e) {
BedrockPlayerSupport.getInstance().getLogger().warning("配置文件更新失败,请将问题反馈至作者");
e.printStackTrace();
}
}
}
}
对应的配置文件:
代码:
# -----------------------------------------------------------
# BedrockPlayerSupport | Made by DongShaoNB
# GitHub: https://github.com/DongShaoNB/BedrockPlayerSupport
# Docs: https://dongshaonb.github.io/BedrockPlayerSupport/#/
# -----------------------------------------------------------
# 自动检查更新
# 默认值: true
check-update: true
# 是否在插件启动时在控制台输出支持的插件的加载状态
# 默认值: true
logging-support-plugin-status: true
# 是否启用基岩版玩家TP菜单(/tpgui)
# 如果没有基础插件,该选项不会生效(即不会启用)
# 默认值: true
bedrock-player-teleport-menu: true
# 是否启用基岩版玩家MSG菜单(/msggui)
# 如果没有基础插件,该选项不会生效(即不会启用)
# 默认值: true
bedrock-player-msg-menu: true
# 是否启用基岩版玩家HOME菜单(/homegui)
# 如果没有基础插件,该选项不会生效(即不会启用)
# 默认值: true
bedrock-player-home-menu: true
# 基础插件(可选值: auto/cmi/essentialsx/huskhomes/disable)
# 当选择auto时按照优先级自动修改为(cmi/essentialsx/huskhomes)其中之一
# 不需要此请设置为disable
# 不区分大小写 请注意有没有写漏字母!
# 默认值: auto
basic-plugin: "auto"
# 登录系统支持
login:
# 是否启用基岩版玩家进服自动登录
# 请注意,注册仍需玩家手动注册,后续登录才可以自动登录
# 默认值: false
enable: false
# 使用的登录插件 (可选值: auto/authme/catseedlogin/nexauth/other)
# 如果是AuthMe请填写authme 其他则为other
# 当选择auto时如果服务器有安装AuthMe插件则自动更改为authme 否则自动关闭该功能
# 如果不需要此功能 请将上方的enable设置为false
# 不区分大小写 请注意有没有写漏字母!
# 默认值: auto
plugin: "auto"
# 当plugin设置为other时 将会调用这里设置的命令在控制台为基岩版玩家自动登录
# 如果你的登录插件没有强制登录命令 请关闭此功能
# 可用变量: %player%: 玩家名
# 默认值: "forcelogin %player%"
forcelogin-command: "forcelogin %player%"
# 自动登录时发送给基岩版玩家的信息
# 默认值: "&a检测到你是基岩版玩家,已自动登录!"
auto-message: "&a检测到你是基岩版玩家,已自动登录!"
# 配置文件版本 (请不要自己修改该值!!!)
config-version: ${project.version}
教程为原创,链接为个人博客文章链接