找不到类定义错误:com/mongodb/client/MongoClients

后端开发 2026-07-09

我一直在做一个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侧边栏显示所有依赖在 compileClasspathruntimeClasspath 上都被标记。

解决方案

基于几篇不同的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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章