开发Minecraft PaperMC插件时,Gradle引入MongoDB遇类找不到错误
java.lang.NoClassDefFoundError问题 问题描述
我在开发Minecraft PaperMC插件时,按照MongoDB Java Sync的快速开始文档用Gradle配置了依赖,但服务器启动并尝试连接数据库时,反复出现java.lang.NoClassDefFoundError: com/mongodb/client/MongoClients错误。
我的Gradle依赖配置如下:
dependencies { implementation(platform("org.mongodb:mongodb-driver-bom:5.6.5")) implementation("org.mongodb:mongodb-driver-sync") compileOnly("io.papermc.paper:paper-api:1.20.6-R0.1-SNAPSHOT") }
用IntelliJ Idea免费版查看,Gradle侧边栏显示所有依赖都已在compileClasspath和runtimeClasspath中,但运行时依然报错。查了不少资料发现很多人碰到同样问题,但没找到明确解决方案,这里分享我自己的解决办法,也欢迎大家提出其他方案。
问题根源
PaperMC插件默认构建的jar包只包含开发者自己编写的代码,不会把implementation声明的第三方依赖(比如MongoDB驱动)打包进去。服务器运行时找不到这些依赖类,就会抛出NoClassDefFoundError。
解决方法
步骤1:引入ShadowJar插件
ShadowJar是一款Gradle插件,能够将第三方依赖打包到最终的插件jar文件中。在build.gradle文件顶部添加插件配置:
plugins { id 'java' id 'com.github.johnrengelman.shadow' version '8.1.1' id 'io.papermc.paperweight.userdev' version '1.5.11' }
注意:确保已经引入了paperweight插件,这是PaperMC官方推荐的插件开发构建工具。
步骤2:(可选)自定义ShadowJar配置
如果需要调整打包规则,比如排除不需要的依赖、自定义jar文件名,可以添加以下配置:
shadowJar { // 设置最终jar的基础名称和版本号 archiveBaseName.set('YourPluginName') archiveVersion.set('1.0.0') // 示例:排除某个不需要的依赖包 exclude('some/unwanted/package/**') }
步骤3:构建包含依赖的插件jar
在Gradle任务中执行shadowJar任务(而非默认的jar任务):
- 在IntelliJ的Gradle侧边栏里,找到
Tasks > shadow > shadowJar,双击执行即可。
步骤4:替换服务器插件文件
构建完成后,在build/libs/目录下找到带有-all后缀的jar包(例如YourPluginName-1.0.0-all.jar),将这个jar包放到服务器的plugins目录中,重启服务器即可。
验证
重启服务器后,插件连接MongoDB时不再抛出NoClassDefFoundError,能够正常完成数据库操作。
内容的提问来源于stack exchange,提问作者Rhombus17

