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的方式,步骤如下:
- 修改
build.gradle的plugins块,添加Shadow插件:
plugins { id 'java' id 'com.github.johnrengelman.shadow' version '7.1.2' }
- 执行构建命令:
gradle shadowJar --no-daemon,生成的Fat Jar会在build/libs/目录下,命名格式为[项目名]-all.jar。 - 修改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
相关产品推荐
相关产品推荐

