Gradle Multiproject Build:如何在不创建伪项目的情况下将WAR项目的JAR包含到另一个WAR中

我有两个网络应用程序AB B使用来自A部分代码。

如果我A声明为B的依赖关系,则A.war包含在A.warWEB-INF/lib

这种包含对容器毫无意义。

我看到的唯一解决方案是将A更改为Java项目(JAR)并创建名为A_WEB的虚拟Web项目(WAR)。 然后A声明为A_WEBB依赖关系

然而,这将要求我干预项目结构。 选择gradle的一个重要原因是它承诺不会像maven那样使项目适应工具。 所以我希望有一种非常混乱的方法。

你是如何宣布依赖的? 我假设您有一个包含子项目A和B的多项目构建,两者都使用War插件。 我使用Gradle 2.4做了一个实验,如果我像这样声明B/build.gradle

 apply plugin: 'war' dependencies { compile project(':A') } 

然后B.war包含WEB-INF/lib/A.jar 。 如果您正确遵循Gradle War插件的惯例(将Web资源放在A/src/main/webapp/A/src/main/resources/代码相关资源),那么A.jar应该包含您想要的内容。

或者,如果你真的需要破解某些东西,你可以选择性地复制A中的东西:

 apply plugin: 'war' war.dependsOn(':A:war') war { from project(':A').sourceSets.main.output.classesDir } 

classesDir是java.io.File一个实例,因此您可以按照Gradle关于使用文件的教程中的描述过滤文件 。

但是,如果你写“ B使用A部分代码”,这意味着你的A实际上包含一个子项目C ,它是由AB共享的代码。 你只是不接受这个事实。 你要做的就是破解并隐藏任何人对C的依赖 – 而不是通过将C作为一个单独的项目提取,设置适当的项目间依赖关系并让Gradle默认行为来正确构建所有内容。 我会说,即使模块间的依赖关系建议你应该提取一个共同的部分,也要做任何事情以防止重新组织磁盘上的文件。