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

Gradle Multiproject Build: How to include JAR of a WAR project into another WAR without creating pseudo projects

我有两个网络应用 ABB 使用了 A.

中的部分代码

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

这种include对容器来说是没有意义的。

我看到的唯一解决方案是将 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 is an instance of java.io.File, so you may filter files as described in Gradle's tutorial on working with files.

但是,如果您写“B 使用了 A 的部分代码”,这意味着您的 A 实际上包含一个子项目 C AB 共享代码。你就是不接受这个事实。你想要做的是绕过并隐藏对 C 的依赖 - 而不是通过将 C 作为一个单独的项目提取出来,设置适当的项目间依赖关系并让 Gradle 默认行为负责正确构建所有内容。我想说的是,即使模块间依赖性建议您应该提取公共部分,也要尝试做任何事情来防止在磁盘上重新组织文件,这很麻烦。