当我明确说明Gradle时,为什么Gradle不包括我的依赖项?

时间:2014-04-10 22:04:45

标签: java gradle

我们正在改造现有的Web应用程序以包含使用JBoss 6 EAP和CXF的SOAP服务。我的问题是,即使我显式状态,我希望我的.war文件中包含某些依赖项(使用“compile {dependency}”),但它们不包括在内。它似乎与其他图书馆有关。

为了成为一名优秀的企业,我将所有cxf依赖项列为'providedCompile',因为JBoss EAP已将它们包含在modules目录中:

providedCompile "org.apache.cxf:cxf-rt-transports-http:2.6.8"
providedCompile "org.apache.cxf:cxf-api:2.6.8"
providedCompile "org.apache.cxf:cxf-rt-bindings-soap:2.6.8"
providedCompile "org.apache.cxf:cxf-rt-bindings-xml:2.6.8"
providedCompile "org.apache.cxf:cxf-rt-core:2.6.8"
providedCompile "org.apache.cxf:cxf-rt-databinding-jaxb:2.6.8"
providedCompile "org.apache.cxf:cxf-rt-frontend-jaxws:2.6.8"
providedCompile "org.apache.cxf:cxf-rt-frontend-simple:2.6.8"
providedCompile "org.apache.cxf:cxf-tools-common:2.6.8"
providedCompile "org.apache.cxf:cxf-tools-validator:2.6.8"
providedCompile "org.apache.cxf:cxf-tools-wsdlto-core:2.6.8"
providedCompile "org.apache.cxf:cxf-tools-wsdlto-databinding-jaxb:2.6.8"

例如,我需要dom4j。我知道我需要它,因为我在启动时看到了ClassNotFoundExceptions。

所以我将它添加到我的依赖项中:

compile "dom4j:dom4j:1.6.1"

没有快乐。也就是说,直到我将所有上述'providedCompile'语句更改为'compile'。

我仍然在制作一个简单的例子,可以在这里发布,但还有其他人看到这样的奇怪行为吗?为什么一个'providedCompile'依赖阻止另一个'compile'依赖项被包含在.war文件中?为什么我必须在我的.war中复制已经由容器提供的库?

1 个答案:

答案 0 :(得分:1)

Gradle假定providedCompile配置的所有依赖关系(包括直接传递依赖关系)在目标环境中可用,因此不会将它们包含在战争中。 dom4j可能是传递providedCompile依赖项。如果您想表达目标环境中只有直接providedCompile依赖项(即构建脚本中明确列出的那些),您可以设置configurations.providedCompile.transitive = false,或者有选择地使用@jar符号(例如providedCompile "org.apache.cxf:cxf-rt-bindings-xml@jar:2.6.8")。

要检查providedCompile中拖放的dom4j依赖关系,请运行gradle dependencyInsight --configuration providedCompile --dependency dom4j