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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:22:53