琳琅项目分为「琳琅-开发者」和「琳琅-运行时」两个部分。在开发时,您只需要引入 linlang-api 作为编译期依赖;在服务器运行时,则需要安装 linlang-runtime-bukkit 插件来提供具体功能。
这两个部分有不同的职责:
linlang-api:包含开发者直接使用的接口、注解和数据类型。linlang-runtime-bukkit:包含 Core、Bukkit 平台实现和运行所需的第三方依赖,并向其他插件提供 Linlang 服务。因此,您的插件不应该将 Linlang API 打包进自己的 Jar。API 由 Linlang 运行时提供,重复打包可能产生错误。
Linlang 使用 Java 17。请先确认您的项目也使用 Java 17 或更高版本进行编译。
在您的 pom.xml 中添加:
<dependency>
<groupId>me.jling</groupId>
<artifactId>linlang-api</artifactId>
<version>1.3.5.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
provided 表示编译时可以使用此依赖,但构建插件时不会将其写入最终 Jar。实际运行所需的 API 和实现均由 linlang-runtime-bukkit 提供。
如果您使用 maven-compiler-plugin,请确保其编译版本至少为 17:
<properties>
<maven.compiler.release>17</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
使用 Linlang 的 Bukkit 插件需要在 plugin.yml 中声明 Linlang 运行时为前置插件:
name: MyPlugin
main: me.example.myplugin.MyPlugin
version: 1.0.0
api-version: '1.18'
depend:
- LinlangRuntimeBukkit
这样 Bukkit 会先加载 LinlangRuntimeBukkit,再加载您的插件。如果运行时缺失,Bukkit 会直接阻止您的插件启动,避免执行依赖 Linlang 的初始化代码。
服务器管理员还需要将与 API 版本兼容的 linlang-runtime-bukkit Jar 放入服务器的 plugins 目录。开发者项目只引入 API,服务器只安装运行时,两者不应交换使用。
flowchart LR
Source["您的插件源码"] -->|编译期依赖| API["linlang-api"]
Plugin["您的插件 Jar"] -->|plugin.yml 前置| Runtime["LinlangRuntimeBukkit"]
Runtime --> Core["linlang-core"]
Runtime --> Bukkit["Bukkit 平台实现"]
Runtime --> API
运行时启动后会通过 Bukkit ServicesManager 注册一个 Linlang 服务。您的插件在初始化时发现这个服务,并基于自己的 JavaPlugin 实例获得独立的服务门面。配置文件、语言文件、命令和界面会因此归属于当前插件,而不是与其他使用 Linlang 的插件混用。
开发时使用的 linlang-api 应与服务器中的 linlang-runtime-bukkit 来自同一个二级版本,也就是版本号的前两位一致,这样可以确保您需要调用的 API 是被支持的。除此外,即使两个版本都能被 Java 加载,接口方法发生变化时仍可能在运行阶段产生 NoSuchMethodError 或初始化失败。
开发版本以 -SNAPSHOT 结尾,内容可能随提交变化。更新 API 后,请重新执行 mvn clean install,并重新编译依赖它的插件。
讨论