使用Gradle构建Jar包时出现java.lang.NoClassDefFoundError问题求助
问题原因与解决方案
问题根源
默认gradlew build生成的Jar包是瘦Jar——只包含你自己项目的编译代码,不会把implementation声明的第三方依赖(比如Gson、Guava)打包进去。在VSCode里直接运行时,IDE会自动把依赖库加入JVM的类路径,所以能正常执行;但单独运行这个Jar时,JVM找不到Gson这些依赖类,就会抛出NoClassDefFoundError。
解决方案(三种常用方式)
方案1:用Shadow插件打包成胖Jar(最推荐)
Shadow插件能把所有依赖库和你的代码打包成一个独立的可执行Jar,运行时不用额外处理依赖。
- 在
build.gradle的plugins块里添加Shadow插件:
plugins { id 'java' id 'com.github.johnrengelman.shadow' version '7.1.2' // 版本可根据你的Gradle版本调整 }
- 保留你原来的
dependencies和jar配置不变,执行打包命令:
./gradlew shadowJar
- 生成的胖Jar在
build/libs/目录下,文件名一般是[你的项目名]-all.jar,直接运行就行:
java -jar build/libs/[你的项目名]-all.jar
方案2:手动修改Jar任务打包依赖
不想用插件的话,可以直接修改jar任务,把依赖库的内容合并到Jar里:
jar { manifest { attributes( 'Main-Class': 'analyser.Run' ) } // 把所有运行时依赖的内容合并到当前Jar from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } // 排除重复的签名文件,避免打包冲突 exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA' }
执行./gradlew build后,生成的Jar就是包含所有依赖的可执行Jar,直接运行即可。
方案3:用Application插件生成启动脚本
Application插件会自动生成带类路径配置的启动脚本,不用手动处理依赖路径:
- 在
build.gradle里添加插件并指定主类:
plugins { id 'java' id 'application' } application { mainClass.set('analyser.Run') }
- 执行命令生成启动脚本:
./gradlew installDist
- 运行脚本:
# Linux/Mac系统 ./build/install/[你的项目名]/bin/[你的项目名] # Windows系统 build\install\[你的项目名]\bin\[你的项目名].bat
内容的提问来源于stack exchange,提问作者flying_kaktus
相关产品推荐
相关产品推荐

