You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:15:36