Gradle多项目构建:编译后将Build目录文件纳入ModuleA.jar的方案
针对你在Spring Boot + GWT的Gradle多项目场景下遇到的问题——想让moduleA的Jar包同时打包自身和moduleB的build目录文件,我给你整理了一套可行的方案,解决之前单项目示例在多项目中不生效的问题:
1. 先确保moduleA构建依赖moduleB的完整构建
多项目里最关键的一点是:必须让moduleA的构建任务等moduleB构建完成后再执行,不然打包时moduleB的build目录还没生成内容。在moduleA/build.gradle里添加任务依赖:
// 让moduleA的build任务依赖moduleB的build任务,保证moduleB先构建完 tasks.named('build').configure { dependsOn ':moduleB:build' }
2. 配置打包任务包含目标目录文件
因为你的项目里GWT编译产物存在ext.buildDir = "${project.buildDir}/gwt",我们需要把moduleA和moduleB的这个目录内容都加入到Jar包中。根据你用的是普通Jar还是Spring Boot可执行Jar,配置略有不同:
情况1:普通Gradle Jar任务
jar { // 加入moduleA自身的GWT编译产物 from "${project.buildDir}/gwt" // 加入moduleB的GWT编译产物,注意用rootProject定位moduleB的路径 from "${rootProject.projectDir}/moduleB/build/gwt" // 如果你需要把整个moduleB的build目录都加进去,替换成下面这行 // from "${rootProject.projectDir}/moduleB/build" }
情况2:Spring Boot的bootJar任务(可执行Jar)
如果你的项目是Spring Boot项目,通常用bootJar打包,配置如下:
bootJar { from "${project.buildDir}/gwt" from "${rootProject.projectDir}/moduleB/build/gwt" // 可选:如果要把这些文件放到Jar包的指定目录(比如WEB-INF/gwt),可以加into配置 // into 'WEB-INF/gwt' }
3. 验证配置效果
执行全项目构建命令:
./gradlew clean build
构建完成后,打开moduleA/build/libs/moduleA-xxx.jar,检查内部是否同时包含了moduleA和moduleB的GWT目录(或整个build目录)的文件。
为什么之前的单项目方案不生效?
你参考的单项目示例是基于单项目路径配置的,而多项目构建中,子项目的路径是相对于根项目的,直接复用单项目的相对路径会找不到moduleB的文件。改用rootProject.projectDir来定位moduleB的build目录,就能解决路径问题了。
另外要注意:如果moduleB里也定义了ext.buildDir = "${project.buildDir}/gwt",那上面的路径就是完全匹配的,要是moduleB的GWT输出目录有自定义,记得同步调整路径。
内容的提问来源于stack exchange,提问作者Aliaksei

