指南

如何用 Kotlin 制作 Minecraft 插件

更新于 2026年10月18日

Kotlin 运行在 JVM 上,所以 Kotlin 插件和 Java 插件使用同样的 Paper 或 Spigot API、同样的 plugin.yml 和同样的 plugins/ 文件夹。代码更短,而且空安全。唯一需要操心、而 Java 插件不必担心的是 Kotlin 标准库:服务器不自带它,所以插件得自己带上。

从这个例子开始。

用 Codexe 生成这个

分步说明

  1. 1.创建使用 Kotlin DSL 的 Gradle 项目

    一个 build.gradle.kts,包含 kotlin("jvm") 插件、与你的 Minecraft 版本匹配的 Java 工具链(17、21 或 25)以及 PaperMC 仓库。

  2. 2.添加服务端 API

    compileOnly("io.papermc.paper:paper-api:<version>")。和 Java 一样,运行时由服务器提供,所以绝不会被打包进去。

  3. 3.编写主类

    class MyPlugin : JavaPlugin(),带 override fun onEnable()。注册命令和监听器的方式和 Java 完全一样。

  4. 4.带上 Kotlin 标准库

    用 Shadow 插件把它打包进 .jar,或者通过 plugin.yml 中的 libraries 列表让服务器在启动时下载它。两者都没有的话,插件会报 NoClassDefFoundError: kotlin/... 并失败。

  5. 5.编写 plugin.yml

    和 Java 插件是同一个文件:name、version、main(Kotlin 类)、api-version、commands 和 permissions。

  6. 6.构建和测试

    ./gradlew shadowJar(或 build),把 build/libs/ 中的 .jar 复制到测试服务器,并查看启动时的控制台。

把 Kotlin 带到服务器上

  • 打包进去(shade):Shadow Gradle 插件会把 Kotlin 标准库和其他运行时库复制进你的 .jar。它适用于所有版本,也是最常见的选择。
  • plugin.yml 中的 libraries:从 Spigot 1.16.5 起,插件可以列出 Maven Central 上的库,由服务器为它下载并加载。.jar 保持小巧,但服务器首次启动时需要联网。
  • 你额外添加的库:kotlinx-coroutines 是一个单独的库,不属于标准库,同样必须打包进去。把它重定位到你自己的包下,可以避免和打包了其他版本的插件发生冲突。

协程与主线程

协程是一种干净的方式,可以从数据库加载数据而不卡住服务器,但 Bukkit API(世界、实体、物品栏)仍然必须在主线程上使用。把耗时的工作放在后台调度器上,然后在操作游戏之前用调度器切回服务器线程。把协程作用域绑定到插件上,这样它会在 onDisable() 中被取消。

Java 还是 Kotlin?

功能JavaKotlin
APIPaper / Spigot同样的 Paper / Spigot API
构建Maven 或 Gradle使用 build.gradle.kts 的 Gradle
运行时附加项无Kotlin 标准库,打包或加载
教程和示例绝大多数较少,但 Java 示例可以直接改写

用 Codexe

选择 Bukkit/Spigot/Paper (Kotlin)。Codexe 会生成一个 Gradle 项目,包含 build.gradle.kts、Paper API、用来打包服务器不提供的内容的 Shadow 插件,代码用到协程时还会把它打包并重定位。插件在标记为就绪之前会被编译,Kotlin 插件和 Java 插件一样,可以在测试服务器上试用,并由测试玩家检查。参见 Kotlin 插件生成器。

“一个名为 Bounties 的 Kotlin 版 Paper 1.21.4 插件:/bounty set <player> <amount> 通过 Vault 设置悬赏,击杀者获得奖励,/bounty top 显示最高的 10 个,数据存储在 SQLite 中,用协程访问数据库。使用 data class 和扩展函数,Bukkit API 调用保持在主线程上。”

常见问题

Kotlin 插件比 Java 插件慢吗?

没有明显差别:两者都编译成 JVM 字节码。打包了标准库时,.jar 会更大一些。

能在一个插件里混用 Java 和 Kotlin 吗?

能,Gradle 会在同一个项目中编译两者,Kotlin 代码可以直接调用 Java 类。

为什么 kotlin 类会报 NoClassDefFoundError?

Kotlin 标准库不在 .jar 里,或者没有被加载。用 shadowJar 构建并安装那个 .jar,或者把这个库加到 plugin.yml 的 libraries 中。

制作 Kotlin 插件

这条提示词打开后即可直接发送:

“一个名为 Bounties 的 Kotlin 版 Paper 1.21.4 插件:/bounty set <player> <amount> 使用 Vault 经济,击杀者获得奖励,/bounty top 显示最高的 10 个,悬赏存储在 SQLite 中并用协程访问数据库,Bukkit API 调用在主线程上,消息在 config.yml 中。”

用 Codexe 生成这个
如何用 Kotlin 制作 Minecraft 插件(Paper) | Codexe