使用Gradle与Spring Boot插件跨模块复制重打包Jar的方法
解决多模块Gradle项目中复制Spring Boot重打包Jar的问题
这个问题我之前帮不少开发者解决过——核心原因就是你没找准Spring Boot重打包Jar的生成任务!默认的jar任务产出的是普通Jar,而Spring Boot插件的bootJar任务才会生成那个包含所有依赖的可执行重打包Jar。下面给你两种最常用的解决方案:
方案一:直接通过任务依赖复制Jar
假设你的Spring Boot模块叫app-module,Docker构建模块叫docker-module,在docker-module的build.gradle里添加以下配置:
Groovy DSL 版本
// 注册一个复制重打包Jar的任务 tasks.register('copyBootJar', Copy) { // 先确保Spring Boot模块的bootJar任务执行完成 dependsOn(':app-module:bootJar') // 指定源文件:app-module的bootJar任务输出的Jar from project(':app-module').tasks.bootJar.outputs.files // 指定目标目录,比如放到docker模块的build/docker/jars下,方便Dockerfile引用 into layout.buildDirectory.dir('docker/jars') } // 让你的Docker构建任务(比如dockerBuild)依赖这个复制任务 tasks.named('dockerBuild') { dependsOn copyBootJar }
Kotlin DSL 版本
tasks.register<Copy>("copyBootJar") { dependsOn(":app-module:bootJar") from(project(":app-module").tasks.bootJar.get().outputs.files) into(layout.buildDirectory.dir("docker/jars")) } tasks.named("dockerBuild") { dependsOn("copyBootJar") }
执行时,直接运行./gradlew dockerBuild,Gradle会自动先构建app-module的重打包Jar,再复制到指定目录,最后执行Docker构建。
方案二:用Docker插件直接关联bootJar产物
如果你用的是Jib这类Gradle Docker插件,完全可以跳过手动复制步骤,直接让插件使用bootJar的产物:
Jib插件配置示例(Groovy DSL)
plugins { id 'com.google.cloud.tools.jib' version '3.4.0' } jib { from { image = 'openjdk:17-jre-slim' // 基础镜像 } to { image = 'your-registry/your-app-image' // 目标镜像名 } container { mainClass = 'com.yourcompany.yourapp.MainApplication' // 主类 } // 关联bootJar任务,确保先构建重打包Jar dependsOn ':app-module:bootJar' // 指定使用app-module的bootJar产物 jar { path = project(':app-module').tasks.bootJar.outputs.files.singleFile.path } }
关键注意点
- 确保你的Spring Boot模块中,
bootJar任务是启用的:Spring Boot插件默认会禁用普通的jar任务,所以不用担心混淆产物,但如果手动开启了jar任务,一定要明确指定依赖bootJar而非jar。 - 替换示例中的模块名称(
app-module、docker-module)、镜像名、主类等为你项目的实际信息。
内容的提问来源于stack exchange,提问作者M. Villalobos
相关产品推荐
相关产品推荐

