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
相关产品推荐
相关产品推荐

