Gradle Multiproject Build:如何在不创建伪项目的情况下将WAR项目的JAR包含到另一个WAR中
我有两个网络应用程序A
和B
B
使用来自A
部分代码。
如果我A
声明为B
的依赖关系,则A.war
包含在A.war
的WEB-INF/lib
中
这种包含对容器毫无意义。
我看到的唯一解决方案是将A
更改为Java项目(JAR)并创建名为A_WEB
的虚拟Web项目(WAR)。 然后A
声明为A_WEB
和B
依赖关系
然而,这将要求我干预项目结构。 选择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
,它是由A
和B
共享的代码。 你只是不接受这个事实。 你要做的就是破解并隐藏任何人对C
的依赖 – 而不是通过将C
作为一个单独的项目提取,设置适当的项目间依赖关系并让Gradle默认行为来正确构建所有内容。 我会说,即使模块间的依赖关系建议你应该提取一个共同的部分,也要做任何事情以防止重新组织磁盘上的文件。