Gradle构建Jar遇NoClassDefFoundError及主类找不到问题求助
问题排查与解决
第一个错误原因
默认的Gradle jar任务仅打包项目自身的编译代码,不会包含implementation配置下的第三方依赖,所以运行时找不到BouncyCastle的Selector类,你的推测完全正确。
第二个错误原因
你修改后的jar配置只添加了第三方依赖的内容,却遗漏了项目自身编译生成的class文件——默认的jar任务原本会自动打包sourceSets.main.output(即你自己写的代码编译产物),但自定义from时没有显式保留这部分,导致主类com.example.fileutil.FilePrepareApplication根本没被打进Jar包,自然找不到。
修复方案
方案1:手动修正Jar任务配置
调整jar任务,先确保包含自身代码,再引入依赖:
jar { duplicatesStrategy = DuplicatesStrategy.INCLUDE manifest { attributes( 'Implementation-Version': '0.0.1-SNAPSHOT', 'Main-Class': 'com.example.fileutil.FilePrepareApplication' ) } // 先加入项目自身的编译产物 from sourceSets.main.output // 再加入implementation依赖的内容 from { configurations.implementation.setCanBeResolved(true) configurations.implementation.collect { it.isDirectory() ? it : zipTree(it) } } }
方案2:使用官方Shadow插件(更推荐)
手动配置Fat Jar容易踩坑,Gradle社区有成熟的shadow插件可以一键生成包含所有依赖的可执行Jar:
- 在
build.gradle中引入插件:
plugins { id 'java' id 'com.github.johnrengelman.shadow' version '7.1.2' // 可替换为最新稳定版 }
- 配置主类:
shadowJar { manifest { attributes 'Main-Class': 'com.example.fileutil.FilePrepareApplication' } }
执行命令./gradlew shadowJar后,生成的可执行Jar会在build/libs/目录下,名称为[项目名]-all.jar,直接运行该Jar即可。
内容的提问来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

