【问题标题】:Why is Gradle not including my dependencies when I specifically state them?为什么当我特别声明它们时,Gradle 不包括我的依赖项?
【发布时间】:2014-04-11 06:42:55
【问题描述】:

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

为了成为一个好人,我将所有 cxf 依赖项都列为 'providedCompile',因为 JBoss EAP 已经将它们包含在模块目录中:

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”依赖阻止另一个“编译”依赖被包含在 .war 文件中?为什么我必须在我的 .war 中复制容器已经提供的库?

【问题讨论】:

  • 您是否检查过该库不在战争中,或者您是否因为 ClassNotFoundException 而认为它不存在?
  • 我通过列出 .war 的内容验证了库不在战争中

标签: java gradle


【解决方案1】:

Gradle 假定 providedCompile 配置的所有依赖项(包括直接 传递依赖项)在目标环境中都可用,因此不将它们包含在 War 中。 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

【讨论】:

  • 谢谢;我错过了“dependencyInsight”任务。不过,在尝试了它(和传递标志)之后,我离解决我的问题还差得远。我的问题是 dom4j(例如;我至少有 5 个导致问题)包含在战争中。 DependencyInsight 告诉我为什么它应该在那里,而不是为什么它被省略。
  • 你听从了我的建议吗?如果你为providedCompile 运行dependencyInsight,它会告诉你什么将被排除
  • 我试过了,但没有任何效果。抱歉暗示我没有尝试过。 “gradle dependencyInsight --configuraion providedCompile --dependency dom4j”返回:在配置':providedCompile'中找不到与给定输入匹配的依赖项这是有道理的,因为dom4j被列为'compile'。如果我将其更改为“providedCompile”,则返回相同的命令: :dependencyInsight dom4j:dom4j:1.6.1 (forced) \--- providedCompile (它是强制的,因为我试图强制给定版本) 我的基本挫折是我的不包括明确指出的依赖关系。
  • 如果你明确指出的依赖也是一个传递的 providedCompile 依赖,这是可以预料的。如果没有,我需要一个可重现的例子来调查。
猜你喜欢
  • 1970-01-01
  • 2017-01-29
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 2020-08-30
  • 2014-10-07
相关资源
最近更新 更多