找不到类定义错误:com/mongodb/client/MongoClients
我一直在做一个Minecraft PaperMC插件,尝试通过Gradle把 MongoDB加入到我的项目时遇到了问题。我按照Java Sync的“入门”步骤进行操作,但在服务器启动时尝试连接数据库时,一直出现这个 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 上都被标记。
解决方案
基于几篇不同的StackOverflow帖子,这是我的结论:
NoClassDefFoundError 可能意味着 几种不同的情况。其中之一是,插件依赖的类在编译时可用,但没有被包含在运行时的jar中。起初我不太理解这是什么意思,但经过一些调查,事实确实如此。
如果你执行 "jar tf build/libs/[my-plugin].jar",你会看到哪些类被包含在你的jar文件中。就我而言,唯一存在的类是我自己创建的类。里面没有MongoDB的任何类。
为了把这些文件包含进去,我最终采用了对 这个回答 的代码稍作修改的版本。此代码放在build.gradle.kts的 tasks 部分
jar {
manifest {
attributes(
"Main-Class" to "com.example.plugin.mainClass"
)
}
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
from(
configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) }
)
}
有了这个修改,插件终于识别出MongoDB。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。