正在载入

等待时间过长时请刷新页面

编写于

最近更新

版本兼容性

Linlang 使用 A.B.C.D 四段版本号。API 与 Runtime 不一定需要完全相同,是否允许运行按照以下规则判断:

差异处理方式
A 或 B 不同无法初始化
A、B 相同,Runtime 的 C 低于插件要求无法初始化,提示 Runtime 可能缺少类或方法
A、B 相同,Runtime 的 C 高于插件要求初始化,但打印兼容性警告
A、B、C 相同,仅 D 不同初始化
版本缺失或格式无效无法初始化,提示检查构建版本信息。

例如,插件依赖 2.3.1.1 时,Runtime 2.3.1.10 可以直接使用,2.3.2.0 会提示警告,2.3.0.102.4.0.0 则不允许运行。

版本检查只比较版本号的数字部分,-SNAPSHOT-rc.1+build.1 等构建后缀不参与兼容性和更新判断。

运行时在创建自身服务前检查随构建加载的 API 版本;插件通过 Lin 初始化时,也会在创建 Facade 和执行初始化回调前检查。拒绝时抛出 IllegalStateException,警告不会中断初始化。

Runtime 的 C 低于插件要求时,运行时无法保证插件引用的新类和新方法存在,因此必须在创建 Facade 前拒绝初始化。提示中会附上 Linlang 项目地址 ⇱,引导管理员安装新构建。仅 D 较低仍然保持静默,因为 D 版本不允许增加公开 API。

声明插件的依赖版本

Bukkit 中多个插件共享运行时提供的 API 类。因此,Lin.API_VERSION 表示当前加载的 API 版本,不能用它判断某个插件编译时使用了哪个版本。

使用 Maven 构建时,Lin.init(this)Lin.setup(this, options)Lin.configure(this, options) 会读取插件 Jar 中的 META-INF/maven/.../pom.xml,找到 me.jling:linlang-api 依赖及其属性值。通常不需要再手写版本参数。

其他构建系统可以在插件 Jar 中提供:

META-INF/linlang/required-api.properties

文件内容为:

version=2.6.1.0

独立版本资源的优先级高于 Maven POM。检测到的值必须符合 A.B.C.D 格式。

无法生成上述构建元数据时,可以显式传入插件依赖的 API 版本:

lin = Lin.setup(this, "2.3.0.1", new LinOptions()
        .pluginLogger(true)
        .totalLocale("zh_CN"));

这里的 2.3.0.1 是插件编译时依赖的 linlang-api 版本,不是插件自身的版本。不要用 Lin.API_VERSION 替代这个声明。

Lin.init(this, requiredVersion)Lin.configure(this, requiredVersion, options)Lin.find(requiredVersion) 和使用回调的 Lin.setup(this, requiredVersion, builder) 都支持相同检查。

如果自动检测失败且没有显式传入版本,初始化会回退到当前加载的 Lin.API_VERSION,此时无法识别插件自身的编译依赖。非 Maven 项目应提供独立版本资源或显式版本。版本检查不会转换不兼容的接口调用;不要通过捕获异常后继续获取服务来绕过检查。

独立检查与后续更新查询

api.linlang.runtime.version.VersionCheck 是不依赖运行时、语言文件或网络的检查入口:

VersionCheck.Result result = VersionCheck.check(requiredVersion, installedVersion);
boolean allowed = result.allowed();
boolean warning = result.warning();
String message = result.message();

check 只返回结果,不输出日志。版本格式错误时返回 INVALIDallowed()false。需要直接拒绝不兼容版本时,可调用 requireCompatible(requiredVersion, installedVersion, warningReceiver),并自行提供警告接收器。

后续网络模块取得最新版本字符串后,可以直接调用:

VersionCheck.UpdateResult update = VersionCheck.checkUpdate(
        lin.runtimeVersion(), latestVersion);

boolean newer = update.updateAvailable();
boolean compatible = update.compatibility().allowed();
String projectUrl = update.projectUrl();

checkUpdate 将最新版本与本地版本比较。仅 D 增加也会令 updateAvailable() 返回 true,但不产生兼容性警告;跨 A.B 的更新会标记为不兼容,不能直接替换。无效版本会抛出 IllegalArgumentException,网络模块应处理远端数据格式错误。

目前没有自动联网、下载或更新行为。调用此入口不会停止正在运行的服务,也不会自动通知管理员,由调用方决定通知时机。

兼容性问题使用 LIN-RUNTIME-VERSION-INCOMPATIBLELIN-RUNTIME-VERSION-MISMATCHLIN-RUNTIME-VERSION-INVALID 三个问题代码。在运行时能够正常启动时,可以通过 /linlang problem <代码> 查询含义。

讨论

请登录账号