如何让Gradle的jar任务生成与bootJar相同的可执行归档文件
让Gradle
jar任务生成与bootJar一致的可执行SpringBoot Jar 问题场景
我有一个基于Gradle的SpringBoot 2.7.9应用,执行./gradlew jar会生成不可执行的repo-0.1.0-SNAPSHOT-plain.jar;执行gradlew bootJar会生成可执行的repo-0.11.0-SNAPSHOT.jar。希望继续使用./gradlew jar命令,让jar任务的输出和bootJar完全一致,需要修改tasks.getByName<Jar>("jar")代码块的配置。
方案一:复用bootJar产物(推荐)
直接让jar任务依赖bootJar,并将其产物复制为jar任务的输出,完全复用SpringBoot插件已处理好的可执行Jar配置:
tasks.getByName<Jar>("jar") { // 禁用原jar任务的默认编译打包逻辑 enabled = false // 确保先执行bootJar任务 dependsOn(tasks.bootJar) // 复制bootJar的产物到jar任务的输出路径 doLast { val bootJarOutput = tasks.bootJar.get().archiveFile.get().asFile val jarTaskOutput = archiveFile.get().asFile bootJarOutput.copyTo(jarTaskOutput, overwrite = true) } }
方案二:手动配置jar任务生成可执行Jar
如果需要手动控制打包逻辑,可直接配置jar任务生成符合SpringBoot规范的可执行Jar:
tasks.getByName<Jar>("jar") { // 去掉默认的"-plain"后缀,和bootJar的文件名保持一致 archiveClassifier.set("") // 继承bootJar的Manifest配置(包含主类、SpringBoot启动信息等) manifest.inheritFrom(tasks.bootJar.get().manifest) // 将项目编译的class文件放入BOOT-INF/classes目录 from(sourceSets.main.get().output) { into("BOOT-INF/classes") } // 将bootJar处理后的依赖包放入BOOT-INF/lib目录 from(tasks.bootJar.get().output.files.filter { it.name.endsWith(".jar") }) { into("BOOT-INF/lib") } }
说明
- 修改后执行
./gradlew jar,会生成和bootJar完全一致的可执行Jar,文件名不再带有-plain后缀。 - 方案一的优势是无需手动处理依赖打包和Manifest配置,完全复用SpringBoot插件的成熟逻辑,避免出错。
内容的提问来源于stack exchange,提问作者bobbyrne01
相关产品推荐
相关产品推荐

