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

时间:2015-05-20 10:41:23

标签: java build gradle build-process

我有两个网络应用ABB使用A中的部分代码。

如果我将A声明为B的依赖项,则A.war包含WEB-INF/lib B.war

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

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

的依赖关系

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

1 个答案:

答案 0 :(得分:3)

你是如何宣布依赖的?我假设您有一个包含子项目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插件的惯例(在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
}

classesDirjava.io.File的一个实例,因此您可以按照Gradle's tutorial on working with files中的说明过滤文件。

但是,如果您写的是" B使用A"中的部分代码,则表示您的A实际上包含子项目{{1}这是由CA共享的代码。你只是不接受这个事实。你要做的就是破解并隐藏任何人对B的依赖 - 而不是通过将C作为一个单独的项目提取,设置适当的项目间依赖关系并让Gradle让它变得清晰默认行为负责正确构建所有。我要说的是,即使模块间的依赖性暗示你应该提取一个共同的部分,但是为了防止在磁盘上重新组织文件,什么是凌乱的东西试图做任何事情。