Kotlin编写的Minecraft Fabric 1.19.3插件执行命令报错求助
问题描述
我开发了一个基于Fabric 1.19.3的Kotlin Minecraft插件,在聊天栏执行/test命令时,未出现预期的“test”消息,反而触发错误。
命令类代码(TestCommand.kt)
package me.lukas.mcplugin1.commands import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.TextColor import org.bukkit.command.Command import org.bukkit.command.CommandExecutor import org.bukkit.command.CommandSender class TestCommand : CommandExecutor { override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<out String>?): Boolean { sender.sendMessage(Component.text("Test").color(TextColor.color(0 ,200, 0))) return false } }
主类代码(McPlugin1.kt)
package me.lukas.mcplugin1 import me.lukas.mcplugin1.commands.JumpCommand import me.lukas.mcplugin1.commands.TestCommand import org.bukkit.plugin.java.JavaPlugin class McPlugin1 : JavaPlugin() { override fun onEnable() { // Plugin startup logic logger.info("Du hast es geschafft !") registerCommands() } private fun registerCommands () { getCommand("jump")?.setExecutor(JumpCommand()) getCommand("test")?.setExecutor(TestCommand()) logger.info("Registered Commands") } override fun onDisable() { // Plugin shutdown logic logger.info("Tschüss") } }
服务器控制台错误日志
[17:54:59 WARN]: Unexpected exception while parsing console command "test" org.bukkit.command.CommandException: Unhandled exception executing command 'test' in plugin Loginplugin v1.0-SNAPSHOT at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[paper-api-1.19.3-R0.1-SNAPSHOT.jar:?] at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:155) ~[paper-api-1.19.3-R0.1-SNAPSHOT.jar:?] at org.bukkit.craftbukkit.v1_19_R2.CraftServer.dispatchCommand(CraftServer.java:929) ~[paper-1.19.3.jar:git-Paper-365] at org.bukkit.craftbukkit.v1_19_R2.CraftServer.dispatchServerCommand(CraftServer.java:892) ~[paper-1.19.3.jar:git-Paper-365] at net.minecraft.server.dedicated.DedicatedServer.handleConsoleInputs(DedicatedServer.java:494) ~[paper-1.19.3.jar:git-Paper-365] at net.minecraft.server.dedicated.DedicatedServer.tickChildren(DedicatedServer.java:441) ~[paper-1.19.3.jar:git-Paper-365] at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1397) ~[paper-1.19.3.jar:git-Paper-365] at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1173) ~[paper-1.19.3.jar:git-Paper-365] at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:316) ~[paper-1.19.3.jar:git-Paper-365] at java.lang.Thread.run(Thread.java:1589) ~[?:?] Caused by: java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics at me.lukas.mcplugin1.commands.TestCommand.onCommand(TestCommand.kt) ~[Mcplugin1.0.jar:?] at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[paper-api-1.19.3-R0.1-SNAPSHOT.jar:?] ... 9 more Caused by: java.lang.ClassNotFoundException: kotlin/jvm/internal/Intrinsics at org.bukkit.plugin.java.PluginClassLoader.loadClass0(PluginClassLoader.java:177) ~[paper-api-1.19.3-R0.1-SNAPSHOT.jar:?] at org.bukkit.plugin.java.PluginClassLoader.loadClass(PluginClassLoader.java:124) ~[paper-api-1.19.3-R0.1-SNAPSHOT.jar:?] at java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[?:?] at me.lukas.mcplugin1.commands.TestCommand.onCommand(TestCommand.kt) ~[Mcplugin1.0.jar:?] at org.bukkit.plugin.java.PluginCommand.execute(PluginCommand.java:45) ~[paper-api-1.19.3-R0.1-SNAPSHOT.jar:?] ... 9 more
错误原因与解决方法
原因分析
日志里的NoClassDefFoundError: kotlin/jvm/internal/Intrinsics和ClassNotFoundException: kotlin/jvm/internal/Intrinsics直接说明:服务器找不到Kotlin标准库的核心类。Kotlin代码编译后必须依赖Kotlin标准库才能运行,但Bukkit/Paper这类Minecraft服务器本身不内置Kotlin运行环境,如果你打包插件时没把Kotlin依赖一起打包,就会触发这个错误。
解决步骤
1. 确认plugin.yml命令配置(已注册可跳过)
确保plugin.yml里正确注册了test命令,否则getCommand("test")会返回null,无法绑定执行器。示例配置:
name: McPlugin1 version: 1.0-SNAPSHOT main: me.lukas.mcplugin1.McPlugin1 api-version: 1.19 commands: test: description: Test command usage: /test jump: description: Jump command usage: /jump
2. 打包时嵌入Kotlin标准库
根据你用的构建工具,配置打包插件把Kotlin依赖嵌入到插件Jar中:
Gradle(Kotlin DSL)配置
用Shadow插件打包Kotlin库,并通过重定位避免和其他插件的Kotlin版本冲突:
plugins { id("java") id("org.jetbrains.kotlin.jvm") version "1.8.22" id("com.github.johnrengelman.shadow") version "7.1.2" } repositories { mavenCentral() maven("https://hub.spigotmc.org/nexus/content/repositories/public/") maven("https://repo.papermc.io/repository/maven-public/") } dependencies { implementation(kotlin("stdlib")) compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") } tasks.shadowJar { archiveBaseName.set("McPlugin1") archiveVersion.set("1.0") // 重定位Kotlin包到插件内部,避免版本冲突 relocate("kotlin", "me.lukas.mcplugin1.libs.kotlin") } // 构建时自动执行shadowJar任务 tasks.build { dependsOn(tasks.shadowJar) }
Maven配置
用maven-shade-plugin打包Kotlin依赖:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <relocations> <relocation> <pattern>kotlin</pattern> <shadedPattern>me.lukas.mcplugin1.libs.kotlin</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>1.8.22</version> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
3. 重新打包测试
运行构建命令(Gradle:./gradlew build;Maven:mvn package),把生成的带依赖的Jar包放到服务器插件目录,重启服务器后再执行/test命令,就能正常显示消息了。
内容的提问来源于stack exchange,提问作者Lukas Hamburger
相关产品推荐
相关产品推荐

