我有两个网络应用A
和B
。 B
使用A
中的部分代码。
如果我将A
声明为B
的依赖项,则A.war
包含WEB-INF/lib
B.war
这种包含对容器毫无意义。
我看到的唯一解决方案是将A
更改为Java项目(JAR)并创建名为A_WEB
的虚拟Web项目(WAR)。然后将A
声明为A_WEB
和B
然而,这需要我干预项目结构。选择gradle的一个重要原因是它承诺不会像maven那样使项目适应工具。所以我希望有一种非常混乱的方法。
答案 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
}
classesDir是java.io.File
的一个实例,因此您可以按照Gradle's tutorial on working with files中的说明过滤文件。
但是,如果您写的是" B
使用A
"中的部分代码,则表示您的A
实际上包含子项目{{1}这是由C
和A
共享的代码。你只是不接受这个事实。你要做的就是破解并隐藏任何人对B
的依赖 - 而不是通过将C
作为一个单独的项目提取,设置适当的项目间依赖关系并让Gradle让它变得清晰默认行为负责正确构建所有。我要说的是,即使模块间的依赖性暗示你应该提取一个共同的部分,但是为了防止在磁盘上重新组织文件,什么是凌乱的东西试图做任何事情。