SnowyGems

版本更新与公告

服务器启动后自动检测新版本与拉取公告的工作方式、全部配置项、以及网络受限时怎么办。

版本更新与公告

服务器完全启动后(控制台出现 Done 之后),插件会静默联网做一次检测:

  • 读取官方版本号,与本地插件版本比对,不一致就在控制台提示去更新
  • 读取公告文本,逐行打印到控制台

拥有管理员权限的玩家上线时,也会单独收到同样的提示。

检测是异步的,不阻塞服务器启动。网络不可达或超时只会在开启 Debug 时记一条日志,绝不影响插件正常工作。

为什么放在启动完成之后

检测挂在 Done 之后而不是插件加载阶段,有两个原因:

  1. 插件加载阶段服务器还在初始化世界、加载其他插件,此时做网络请求会拖慢启动
  2. 控制台在启动过程中刷屏严重,提示会被淹没;Done 之后打印,服主一眼就能看到

版本判定规则

只要本地版本与官方版本不完全一致就提示更新,不做大小比较。

本地版本官方版本是否提示
0.0.00.0.1提示
0.0.10.0.1不提示
0.0.20.0.1提示
v1.0V1.0不提示(忽略大小写)
比本地版本「更低」的官方版本也会提示,这是有意设计。含义是「你手上这个版本不是官方在发的那个版本」——可能是自行改过的、也可能是从非官方渠道拿到的,都值得去核对一下。按版本号大小比较反而会漏掉这些情况。

比较时会去掉首尾空白并忽略大小写差异。


配置

config.ymlUpdateChecker 一节:

UpdateChecker:
  Enabled: true
  Announcement: true
  AdminPermission: snowygems.admin
  NotifyAdminOnJoin: true
  # 请不要修改下面的两个链接
  VersionUrl: "https://raw.githubusercontent.com/SnowyMCT/SnowyGems-VersionCheck/main/version.txt"
  AnnouncementUrl: "https://raw.githubusercontent.com/SnowyMCT/SnowyGems-VersionCheck/main/ann.txt"
  Timeout: 8
字段默认说明
Enabledtrue版本更新检测总开关
Announcementtrue公告拉取总开关,可与更新检测分别关闭
AdminPermissionsnowygems.admin哪个权限节点算「管理员」
NotifyAdminOnJointruefalse = 只在控制台提示,不打扰任何玩家
VersionUrl官方源版本号来源
AnnouncementUrl官方源公告来源
Timeout8连接与读取超时秒数,范围 1 ~ 60

EnabledAnnouncement 同时false 时,启动检测整个跳过,不会有任何网络请求。

改完需要 /sgem reload


完全关掉

UpdateChecker:
  Enabled: false
  Announcement: false

这样插件永远不会联网。适合内网服务器或不希望有任何出网行为的环境。

只想关掉玩家提示、保留控制台提示:

UpdateChecker:
  NotifyAdminOnJoin: false

远端文件格式

如果你要自建版本源(比如给自己的分支用),格式如下。

version.txt

version: 0.0.1
date: 2026年7月31日

version:date: 都不区分大小写。只写一行纯版本号也能识别——解析不到 version: 时会把第一个非空行整体当作版本号。

ann.txt:纯文本,多行,每行原样作为一条公告展示,支持 & 颜色码。

&e欢迎使用 SnowyGems 先行版!
&7如果你有什么问题,请及时报告哦~

公告末尾的空行会被自动去掉。


提示文案自定义

全部文案在 lang.ymlupdate 节点,支持 & 颜色码与 title: / actionbar: / none: 前缀:

update:
  # 控制台: 本地版本与官方不一致  占位符: {current} 当前版本  {latest} 官方版本  {date} 发布日期
  console-available: "&e[SnowyGems] &f当前版本 &7{current} &f与官方 &a{latest} &7({date})&f 不一致, 请前往更新~"
  # 控制台: 与官方一致  占位符: {current}
  console-latest: "&8[SnowyGems] &7当前版本 &f{current} &7已是官方最新"
  # 管理员上线: 本地版本与官方不一致  占位符: {current} {latest} {date}
  player-available: "&e[SnowyGems] &f当前版本 &7{current} &f与官方 &a{latest} &7({date})&f 不一致, 请前往更新~"
  # 公告展示的头尾装饰(公告正文来自远端 ann.txt, 每行原样显示)
  announce-header: "&b&m        &r &b&l公告 &b&m        "
  announce-footer: "&b&m                                "

lang.yml 是热重载的,改完保存即生效。

不想让管理员上线时被公告刷屏,但又想保留更新提示:把 player-available 留着,然后设 Announcement: false(公告在控制台也不显示),或者把 announce-header / announce-footer 改成 none: 让装饰行消失。

网络受限环境

联网走 JDK 自带的 HTTP,自动遵循服务端启动参数里的系统代理。插件不写死任何代理地址。

需要代理访问 GitHub 时,在启动脚本里加:

java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=7890 \
     -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=7890 \
     -jar paper.jar

或者干脆关掉检测(见上文)。

检测失败不会有任何报错,只在开启 Debug 且启用 Update tag 时记一行日志:

/sgem debug Update

日志会打印实际请求的 URL、HTTP 状态码、以及失败的异常类型。


常见问题

每次启动都要联网,会不会拖慢启动?

不会。检测在 Done 之后异步执行,且有超时保护(默认 8 秒)。启动流程完全不等它。

玩家上线会不会每次都重新联网?

不会。玩家上线提示复用启动时那一次的检测结果,不产生新的网络请求。

/sgem reload 会重新检测吗?

reload 只重读配置(URL、开关、超时等),不会重新发起检测。重新检测需要重启服务器。

控制台提示了新版本,但我确认自己是最新的?

对比一下 gradle.properties / JAR 文件名里的版本号与官方 version.txt 的内容,注意是否有多余空格或大小写差异之外的不同。判定是严格的字符串比较(去空白、忽略大小写)。

能不能改成每隔几小时检测一次?

当前版本只在启动时检测一次,没有定时轮询。设计上认为「服主重启服务器的频率」已经足够覆盖版本更新的节奏,定时联网收益不大。

Copyright © 2026