• 200金粒签到奖励和周年纪念勋章(4/5/6/7周年)销售将于 4月13日晚结束,不要错过噢!【点我去看看】

Java 我的世界Spigot插件自动更新配置文件功能

背景
我开发的一个插件BedrockPlayerSupport恰好需要自动更新配置文件而不丢失已有设置这个功能,所以就写了一个相关代码,供大家参考
思路
一个完美的自动更新配置文件:
  1. 服主更新插件重启服务器后插件自动更新配置文件
  2. 自动更新配置文件不会丢失之前设置的数据
  3. 新增的原有的配置选项注释要保留
至此,我们可以明确思路:
  1. 运行插件时检测是否已经存在配置文件,若存在,则说明用户不是第一次运行,检查配置文件版本
  2. 对比配置文件的版本号和插件内打包的配置文件版本号是否相同
  3. 若版本号不相同,则说明配置文件需要更新(降版本也会触发,但是有人会降版本使用吗:开森:
  4. 将旧的配置文件 (config.yml) 重命名为 old_config.yml,并生成新的 config.yml
  5. 读取旧的配置文件,遍历key,获取对应的值,然后设置新的配置文件,完成后保存文件
  6. 重新检测配置文件版本号,如果和插件内的配置文件版本号相同,说明更新成功
注意事项
特别需要注意的是: 在设置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}

教程为原创,链接为个人博客文章链接
 

在线管理成员

在线会员

  • sevenjam
  • MiaoXiaoliu
  • umaru
  • BrAeRd
  • pingguo
  • 729673852@
  • 刘文浩
  • 三秒记忆的石子
  • shiy03313
  • Narcssu
  • Oppp114514666
  • 乱杖先生
  • llm2333
  • ovouo
  • XunHai
  • qwertfxzcvb
  • ayoiz
  • 1930040902
  • 胖企鹅
  • Super9k
  • PuddingKC
...和 26 更多。
后退
顶部 底部