如何将一个Gradle项目的制品作为资源引入另一个同级Gradle项目?
同级Gradle项目构建联动方案
核心实现思路
无需调整现有同级目录结构,也不用复合构建,直接在ServerApp的构建脚本中定义任务依赖+文件复制逻辑,就能实现构建ServerApp时自动触发ClientJAR的bootJar构建,并将产物嵌入ServerApp资源中。
具体配置(ServerApp/build.gradle)
// 任务1:触发ClientJAR的bootJar构建 task buildClientJar(type: Exec) { // 根据系统选择对应的gradlew脚本 def gradlewScript = System.getProperty('os.name').toLowerCase().contains('windows') ? '../ClientJAR/gradlew.bat' : '../ClientJAR/gradlew' commandLine = [gradlewScript, 'bootJar'] // 确保清理任务完成后再执行该任务 mustRunAfter clean } // 任务2:将ClientJAR的bootJar产物复制到ServerApp资源目录 task copyClientJarToResources(type: Copy) { // 源路径:ClientJAR的bootJar输出目录 from '../ClientJAR/build/libs/' // 匹配Spring Boot生成的bootJar制品(可根据实际命名调整规则) include '*-boot.jar' // 目标路径:ServerApp的构建资源目录,会被打包进最终产物 into "$buildDir/resources/main/static/client" // 依赖buildClientJar,确保先构建ClientJAR再复制 dependsOn buildClientJar } // 让ServerApp的资源处理任务依赖复制任务,构建时自动执行 processResources.dependsOn copyClientJarToResources
验证与使用
- 执行ServerApp构建命令:
cd ServerApp ./gradlew build
此时会自动完成流程:ClientJAR的bootJar构建 → 产物复制到ServerApp资源目录 → ServerApp自身构建打包。
- 产物访问:
复制后的ClientJAR会被打包进ServerApp的Spring Boot JAR中,放在static/client路径下,可通过ServerApp的HTTP端点(比如GET /client/[文件名].jar)提供下载。
补充优化点
- 精确匹配制品:如果ClientJAR的bootJar有固定命名,可将
include '*-boot.jar'改为具体文件名(如include 'ClientJAR-v1.0.0-boot.jar'),避免匹配多余文件。 - 跳过ClientJAR构建:本地调试时若无需重新构建ClientJAR,可添加参数跳过:
./gradlew build -x buildClientJar
内容的提问来源于stack exchange,提问作者E-Riz
相关产品推荐
相关产品推荐

