在Minecraft Java插件中运行JDA时出现NoClassDefFoundError求助
问题解决:Minecraft插件集成JDA出现NoClassDefFoundError
问题原因
你遇到的NoClassDefFoundError是因为JDA依赖没有被打包进最终的插件Jar文件。当前Gradle配置中,JDA使用了compileOnly依赖类型,这个类型仅在编译代码时提供类文件,不会将依赖的Jar包内容合并到你的插件Jar中,导致Minecraft服务器运行时找不到JDA的相关类。
解决方案:使用Shadow插件打包依赖
Spigot/Paper插件通常需要将第三方依赖(如JDA)打包进自身Jar文件中,这里推荐使用Gradle的Shadow插件来完成这个工作,步骤如下:
1. 修改Gradle配置文件
更新你的build.gradle,引入Shadow插件并调整依赖配置:
plugins { id("java") id("com.github.johnrengelman.shadow") version "8.1.1" // 引入Shadow插件 } group = "org.xeon.bot" version = "1.0-SNAPSHOT" repositories { mavenCentral() maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") maven("https://oss.sonatype.org/content/repositories/snapshots") maven("https://oss.sonatype.org/content/repositories/central") } dependencies { testImplementation(platform("org.junit:junit-bom:5.10.0")) testImplementation("org.junit.jupiter:junit-jupiter") compileOnly("org.spigotmc:spigot-api:1.21-R0.1-SNAPSHOT") // Spigot API用compileOnly,服务器已自带 implementation("net.dv8tion:JDA:5.0.1") // 改为implementation,让Shadow插件能打包它 } tasks.test { useJUnitPlatform() } // 可选:配置Shadow插件排除不需要的文件,优化Jar大小 tasks.shadowJar { // 排除Spigot API相关类(服务器已提供) exclude("org/bukkit/**") exclude("org/spigotmc/**") // 设置最终Jar的名称,方便识别 archiveBaseName.set("MinecraftDiscordBot") archiveClassifier.set("") // 去掉默认的"-all"后缀 }
2. 执行打包命令
在项目根目录下运行以下Gradle命令,生成包含JDA依赖的插件Jar:
./gradlew shadowJar
打包后的Jar文件会位于build/libs/目录下,名称为MinecraftDiscordBot-1.0-SNAPSHOT.jar(根据配置调整)。
3. 替换服务器插件
将生成的Shadow Jar文件替换原来的插件Jar,重启Minecraft服务器即可解决错误。
额外说明
compileOnly适用于服务器已经自带的依赖(如Spigot API),不需要打包进插件;而第三方依赖(如JDA)需要用implementation或api,让Shadow插件能将其合并到最终Jar中。- 如果遇到JDA的传递依赖冲突,可以在
implementation中添加exclude规则排除冲突的依赖,例如:implementation("net.dv8tion:JDA:5.0.1") { exclude(group = "some.conflicting.group") }
内容的提问来源于stack exchange,提问作者Xeon
相关产品推荐
相关产品推荐

