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

Spigot 1.8.8 Kotlin插件ClassNotFoundException问题求助

问题描述

开发基于Kotlin的Spigot 1.8.8 OITC插件时,触发PlayerDropItemEvent时抛出以下异常:

Could not pass event PlayerDropItemEvent to RarityOITC v1.0-SNAPSHOT
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics

项目代码逻辑无问题,主类与事件处理器代码如下:

主类代码

package me.ysheiny.rarityoitc

import me.ysheiny.rarityoitc.handlers.PlayerHandler
import org.bukkit.plugin.java.JavaPlugin

class RarityOITC : JavaPlugin() {

    val prefix = "[&bRarity&dOITC&f]"
    override fun onEnable() {
        // Plugin startup logic
        logger.info("Plugin Enabled!")

        PlayerHandler(this)
    }

    override fun onDisable() {
        // Plugin shutdown logic
        logger.info("Plugin Disabled!")
    }
}

PlayerHandler代码

package me.ysheiny.rarityoitc.handlers

import me.ysheiny.rarityoitc.RarityOITC
import org.bukkit.Bukkit
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerDropItemEvent

class PlayerHandler(plugin: RarityOITC?) : Listener {
    init {
        Bukkit.getPluginManager().registerEvents(this, plugin)
    }

    @EventHandler
    fun onPlayerDropItem(event: PlayerDropItemEvent)
    {
        event.isCancelled = true
    }
}

使用Maven构建,当前依赖配置:

<dependencies>
        <dependency>
            <groupId>com.sample</groupId>
            <artifactId>sample</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/spigot-1.8.8.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib-jdk8</artifactId>
            <version>${kotlin.version}</version>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-runtime</artifactId>
            <version>1.2.71</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/kotlin-runtime-1.2.71.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-test</artifactId>
            <version>${kotlin.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

手动添加的Kotlin Runtime版本过旧,触发IDE提示:

Kotlin: API version 1.2 is no longer supported; please, use version 1.3 or greater.
解决方案

1. 修正Kotlin依赖配置,移除本地system依赖

Kotlin 1.3及以后版本已将kotlin-runtime合并到kotlin-stdlib中,无需单独引入。同时避免使用system scope依赖,改用Maven仓库的标准依赖,确保版本兼容。

更新后的Maven依赖配置:

<properties>
    <!-- 选用兼容Spigot 1.8.8的Kotlin版本,1.6.21适配Java 8且符合IDE API要求 -->
    <kotlin.version>1.6.21</kotlin.version>
</properties>

<dependencies>
    <!-- Spigot 1.8.8依赖,优先用官方仓库,本地文件需设为provided避免打包冲突 -->
    <dependency>
        <groupId>org.spigotmc</groupId>
        <artifactId>spigot-api</artifactId>
        <version>1.8.8-R0.1-SNAPSHOT</version>
        <scope>provided</scope>
        <!-- 本地文件替换方案:
        <scope>system</scope>
        <systemPath>${project.basedir}/src/main/resources/spigot-1.8.8.jar</systemPath> -->
    </dependency>
    
    <!-- Kotlin标准库,包含runtime,适配Java 8 -->
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib-jdk8</artifactId>
        <version>${kotlin.version}</version>
        <scope>compile</scope>
    </dependency>
    
    <!-- 测试依赖保留 -->
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-test</artifactId>
        <version>${kotlin.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>

2. 配置Maven打包插件,将Kotlin运行时打包进插件

Spigot服务器不自带Kotlin运行时,需将Kotlin标准库打包进插件Jar。使用maven-shade-plugin实现:

在build节点下添加插件配置:

<build>
    <plugins>
        <!-- Kotlin编译插件,指定Java 8目标版本 -->
        <plugin>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-plugin</artifactId>
            <version>${kotlin.version}</version>
            <executions>
                <execution>
                    <id>compile</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
                <execution>
                    <id>test-compile</id>
                    <phase>test-compile</phase>
                    <goals>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <jvmTarget>1.8</jvmTarget>
            </configuration>
        </plugin>
        
        <!-- Shade插件打包Kotlin依赖,排除Spigot避免冲突,可重命名包防止版本冲突 -->
        <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>
                        <excludeGroupIds>org.spigotmc</excludeGroupIds>
                        <relocations>
                            <relocation>
                                <pattern>org.jetbrains.kotlin</pattern>
                                <shadedPattern>me.ysheiny.rarityoitc.libs.kotlin</shadedPattern>
                            </relocation>
                            <relocation>
                                <pattern>kotlin</pattern>
                                <shadedPattern>me.ysheiny.rarityoitc.libs.kotlin.stdlib</shadedPattern>
                            </relocation>
                        </relocations>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

3. 同步IDE的Kotlin版本设置

在IntelliJ IDEA中,打开File > Project Structure > Project Settings > Modules,确保模块的Kotlin语言版本与Maven中配置的kotlin.version一致(如1.6.21),同时将目标字节码版本设为1.8。

4. 优化事件处理器初始化逻辑

将plugin参数设为非空类型(onEnable中传入的this不可能为空),避免潜在空指针:

class PlayerHandler(plugin: RarityOITC) : Listener {
    init {
        Bukkit.getPluginManager().registerEvents(this, plugin)
    }

    @EventHandler
    fun onPlayerDropItem(event: PlayerDropItemEvent) {
        event.isCancelled = true
    }
}

内容的提问来源于stack exchange,提问作者YSheiny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:27:32