Gradle 多项目构建:如何在不创建伪项目的情况下将 WAR 项目的 JAR 包含到另一个 WAR 中
Gradle Multiproject Build: How to include JAR of a WAR project into another WAR without creating pseudo projects
我有两个网络应用 A
和 B
。 B
使用了 A
.
中的部分代码
如果我将 A
声明为 B
的依赖项,则 A.war
包含 WEB-INF/lib
of B.war
这种include对容器来说是没有意义的。
我看到的唯一解决方案是将 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 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
A
和 B
共享代码。你就是不接受这个事实。你想要做的是绕过并隐藏对 C
的依赖 - 而不是通过将 C
作为一个单独的项目提取出来,设置适当的项目间依赖关系并让 Gradle 默认行为负责正确构建所有内容。我想说的是,即使模块间依赖性建议您应该提取公共部分,也要尝试做任何事情来防止在磁盘上重新组织文件,这很麻烦。
我有两个网络应用 A
和 B
。 B
使用了 A
.
如果我将 A
声明为 B
的依赖项,则 A.war
包含 WEB-INF/lib
of B.war
这种include对容器来说是没有意义的。
我看到的唯一解决方案是将 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 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
A
和 B
共享代码。你就是不接受这个事实。你想要做的是绕过并隐藏对 C
的依赖 - 而不是通过将 C
作为一个单独的项目提取出来,设置适当的项目间依赖关系并让 Gradle 默认行为负责正确构建所有内容。我想说的是,即使模块间依赖性建议您应该提取公共部分,也要尝试做任何事情来防止在磁盘上重新组织文件,这很麻烦。