首页 文章

Gradle传递依赖性排除不能按预期工作 . (如何摆脱com.google.guava:guava-jdk5:13.0?)

提问于
浏览
8

这是我的build.gradle的片段:

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看到导入多个版本的guava:

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)

我尝试将依赖项删除到:通过执行:

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保持不变 . 我也试过了

compile ('com.google.guava:guava:15.0'){force = true}

但依赖洞察力仍然保持不变 . 如何摆脱com.google.guava:guava-jdk5:13.0?

详细信息:我在Windows 8.1机器上尝试过gradle 1.2和2.1

我尝试这个的原因是摆脱这个例外:

java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch;

3 回答

  • 23

    如果某个地方存在另一个指向同一个依赖关系而没有任何排除的依赖关系,那么似乎不会排除依赖关系 .

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

    configurations {
      all*.exclude group: 'com.google.guava', module:'guava-jdk5'
    }
    
  • 3

    事实证明,guava-jdk5仍在维护中 .

    所以我改变了这个:

    compile ('com.google.guava:guava:15.0'){force = true}
    

    为了这:

    compile('com.google.guava:guava-jdk5:17.0') { force = true }
    

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

  • 4

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

    考虑以下依赖树(由命令gradle <my-project-name>:dependencies生成):

    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文件如下所示:

    // ... 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在其答案中所示),您可以始终只从显式引用它的两个依赖项中排除传递依赖项 .

相关问题