所以,假设我有这样的项目结构:
Root
projA
projA1-api
projA2-core
projA3-main
projB
projB1-api
projB2-core
projB3-main
projC
projC1-api
projC2-core
projC3-main
and so on...
一些子项目(以“-main”结尾的子项目)已经应用了war
和Spring boot
插件,根build. gradle文件没有。这意味着项目promA3-main、promB3-main和promC3-main具有bootWar
任务,它会禁用war
任务。
现在,问题在于我们的jenkins管道通过执行gradle war
命令来构建战争,这很糟糕并且无法更改。
所以,我想做的是修改每个包含war插件的子项目中的war任务,方法是将其设置为依赖于bootWar
任务。我可以通过将war.依赖于bootWar
添加到子项目的build. gradle
文件中来做到这一点,这是可行的,但我想将该代码提取到根build.gradle
中。
此外,我希望war
任务也执行在根build. gradle
中定义的另一个任务(让我们称之为CustPrintTask
),它只是将内容打印到某个文件中。
总结一下:
root build. gradle没有war、bootWar或Spring Boot插件,但有自定义PrintTask任务
“-main”子项目有bootWar和Spring boot插件,他们也有war插件,但是因为我使用的是Spring Boot 2 gradle插件,war任务不会生成war。
基本上,我想要这样的东西:
allprojects {
if (project.plugins.hasPlugin("war")) {
war.dependsOn bootWar
war.finalizedBy customPrintTask
}
}
我希望这有意义。
哟,想通了。
allprojects {
tasks.withType(War) {
if (it.name != "bootWar") {
dependsOn(customPrintTask)
dependsOn(":" + it.project.name.replace("-main", "") + ":" + it.project.name + ":bootWar")
}
}
}
我知道没有人关心,但是这样我迭代了每个类型为War
的任务,如果任务名称不是bootWar
(因为循环依赖),那么依赖于我的自定义打印任务,也依赖于位于我当前迭代的子项目中的bootWar
任务,这就是它看起来愚蠢的原因。
很简单,不知道我是怎么错过这个的…看起来极其丑陋,但它有效!