You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker运行Java应用时出现java.lang.NoClassDefFoundError问题排查

问题解决:Java容器运行时NoClassDefFoundError缺失MongoDB类

你遇到的java.lang.NoClassDefFoundError: com/mongodb/client/MongoClients错误,核心原因是当前构建的jar包仅包含自身业务代码,未打包依赖的第三方库(比如MongoDB驱动),导致JVM运行时无法找到这些类。

解决方案:打包包含依赖的Fat Jar(Uber Jar)

方式一:使用Gradle Shadow插件(推荐)

这是最稳定的生成Fat Jar的方式,步骤如下:

  1. 修改build.gradle的plugins块,添加Shadow插件:
plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '7.1.2'
}
  1. 执行构建命令:gradle shadowJar --no-daemon,生成的Fat Jar会在build/libs/目录下,命名格式为[项目名]-all.jar。
  2. 修改Dockerfile中的COPY指令,匹配Fat Jar:
COPY --from=build /home/gradle/src/build/libs/*all.jar /app/app.jar

方式二:手动配置Jar任务(不推荐,易出现冲突)

如果不想使用插件,可以修改现有jar任务,将依赖库打包进Jar:

jar {
    manifest {
        attributes(
                'Main-Class': 'packagename.Application',
                'Class-Path': configurations.runtimeClasspath.files.collect { it.name }.join(' ')
        )
    }
    // 将依赖的class文件和资源打包到当前Jar
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

执行gradle build --no-daemon后,生成的Jar会包含所有依赖类,但可能出现文件重复或版本冲突问题。

关键说明

你的build.gradle本身依赖配置是正确的(已经引入了mongodb-driver-sync),问题出在Jar打包阶段未包含依赖,通过上述任一方式修改后,容器运行时就能找到MongoDB相关类。

内容的提问来源于stack exchange,提问作者pyQueen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:15:35