首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gradle传递依赖项排除不像预期的那样工作。(如何摆脱com.google.guava:番石榴-jdk5 5:13.0 ?)

Gradle传递依赖项排除不像预期的那样工作。(如何摆脱com.google.guava:番石榴-jdk5 5:13.0 ?)
EN

Stack Overflow用户
提问于 2014-09-11 16:15:15
回答 5查看 26.4K关注 0票数 23

下面是我的build.gradle的一个片段:

代码语言:javascript
复制
compile 'com.google.api-client:google-api-client:1.19.0'
compile 'com.google.apis:google-api-services-oauth2:v2-rev77-1.19.0'
compile 'com.google.apis:google-api-services-plus:v1-rev155-1.19.0'
compile 'com.google.appengine.tools:appengine-gcs-client:0.4.1'
compile 'com.google.appengine.tools:appengine-mapreduce:0.8'

它导入多个版本的番石榴,如您在dependencyInsight中看到的那样:

代码语言:javascript
复制
com.google.guava:guava:15.0 (conflict resolution)

com.google.guava:guava:14.0.1 -> 15.0
+--- com.googlecode.objectify:objectify:4.1.3
|    \--- default
\--- net.eusashead.spring:spring-cache-gae:1.0.0.RELEASE
     \--- default

com.google.guava:guava:[15.0,15.99] -> 15.0
+--- com.google.appengine.tools:appengine-gcs-client:0.4.1
|    +--- default
|    +--- com.google.appengine.tools:appengine-mapreduce:0.8
|    |    \--- default
|    \--- com.google.appengine.tools:appengine-pipeline:0.2.10
|         \--- com.google.appengine.tools:appengine-mapreduce:0.8 (*)
+--- com.google.appengine.tools:appengine-mapreduce:0.8 (*)
\--- com.google.appengine.tools:appengine-pipeline:0.2.10 (*)

com.google.guava:guava-jdk5:13.0
\--- com.google.api-client:google-api-client:1.19.0
     +--- default
     +--- com.google.apis:google-api-services-oauth2:v2-rev77-1.19.0
     |    \--- default
     +--- com.google.apis:google-api-services-plus:v1-rev155-1.19.0
     |    \--- default
     +--- com.google.appengine.tools:appengine-gcs-client:0.4.1
     |    +--- default
     |    +--- com.google.appengine.tools:appengine-mapreduce:0.8
     |    |    \--- default
     |    \--- com.google.appengine.tools:appengine-pipeline:0.2.10
     |         \--- com.google.appengine.tools:appengine-mapreduce:0.8 (*)
     +--- com.google.api-client:google-api-client-appengine:1.17.0-rc
     |    \--- com.google.appengine.tools:appengine-gcs-client:0.4.1 (*)
     +--- com.google.apis:google-api-services-storage:v1-rev1-1.18.0-rc
     |    \--- com.google.appengine.tools:appengine-gcs-client:0.4.1 (*)
     +--- com.google.apis:google-api-services-bigquery:v2-rev154-1.19.0
     |    \--- com.google.appengine.tools:appengine-mapreduce:0.8 (*)
     \--- com.google.api-client:google-api-client-servlet:1.17.0-rc
          \--- com.google.api-client:google-api-client-appengine:1.17.0-rc (*)

(*) - dependencies omitted (listed previously)

通过执行以下操作,我尝试将依赖项删除为:

代码语言:javascript
复制
compile ('com.google.api-client:google-api-client:1.19.0'){
        exclude group: 'com.google.guava', module: 'guava-jdk5'
    }
compile ('com.google.api-client:google-api-client:1.19.0'){
        exclude group: 'com.google.guava', 
    }

但dependencyInsight保持不变。我也试过

代码语言:javascript
复制
compile ('com.google.guava:guava:15.0'){force = true}

但是,依赖洞察力仍然是一样的。我如何摆脱com.google.guava:番石榴-jdk5 5:13.0?

详细信息:我已经在windows 8.1框上试用了gradle 1.2和2.1

我尝试这样做的原因是为了摆脱这个异常:

代码语言:javascript
复制
java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch;
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-10-11 17:41:04

原来番石榴-jdk5 5还在维护中。

所以我改变了这个:

代码语言:javascript
复制
compile ('com.google.guava:guava:15.0'){force = true}

为此:

代码语言:javascript
复制
compile('com.google.guava:guava-jdk5:17.0') { force = true }

这解决了我的问题,我现在可以使用Google项目中“com.google.common”包中的类和所有描述的依赖项

票数 5
EN

Stack Overflow用户

发布于 2014-11-20 16:21:06

如果某个地方有另一个依赖项指向相同的依赖项而没有任何排除项,则似乎不会排除该依赖项。

但是,您可以通过configuration排除依赖关系:

代码语言:javascript
复制
configurations {
  all*.exclude group: 'com.google.guava', module:'guava-jdk5'
}
票数 40
EN

Stack Overflow用户

发布于 2017-08-10 20:15:30

基于@thoutbeckers的回答,因为有一个特殊的案例,我不认为他的答案适用,但它确实适用。希望这个答案能帮助那些分享我的特例问题的人。最初,我认为坏的传递依赖仅由build.gradle文件中的一个依赖项引用,但实际上由两个依赖项引用。这是因为引用不良传递依赖关系的两个依赖项都有父/子关系,但我只注意到了与子依赖的关系,而没有注意到父依赖关系。

考虑以下依赖树(由命令gradle :dependencies生成):

代码语言:javascript
复制
compileClasspath - Compile classpath for source set 'main'.
+--- my.org:com.my.pkg.parent:6.+ -> 6.0.4
|    +--- # misc. dependencies
|    +--- my.org:com.my.pkg.child:6.0.4
|    |    +--- # misc. dependencies
|    |    +--- other.org:bad.transitive.dependency:0.9.1 FAILED
|    |    +--- # misc. dependencies
|    |--- # misc. dependencies
+--- # misc. dependencies

从依赖树看,other.org:bad.transitive:dependency:0.9.1只由构建文件中的一个依赖项引用,而不是两个。但是,假设您的Gradle文件如下所示:

代码语言:javascript
复制
// ... misc. ...
dependencies {
    // ... misc. dependencies ...
    compile 'my.org:com.my.pkg.parent:6.+'
    // ... misc. dependencies ...
    compile ('my.org:com.my.pkg.child:6.0.4') {
        exclude group: 'other.org', module: 'bad.transitive.dependency'
}

对于上面这样的Gradle文件,即使您想要排除的传递依赖只发生在子依赖中,而不是父依赖项中,错误仍然存在。但是,由于父项目和子项目都由build.gradle文件引用,因此必须从两个依赖项中排除不良的传递依赖项,如上面所述的@thoutbeckers。

请注意,如果不希望在配置级别添加排除(如@thoutbeckers在其答复中所示),则始终可以显式地从引用它的两个依赖项中排除传递依赖项。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25792398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档