Gradle 传递依赖关系排除未按预期工作。(我如何摆脱com.google.guava:guava-jdk5:13.0 ?

这是我的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'

它导入了多个版本的番石榴,正如你所看到的依赖Insight:

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', 
    }

但依赖性见解保持不变。我也试过

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;

答案 1

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

但是,您可以通过以下方式排除依赖项:configuration

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

答案 2

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

请考虑以下依赖关系树(由命令 gradle <my-project-name>:d pendencies 生成):

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

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

// ... 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所示),则始终可以从引用可传递依赖项的两个依赖项中显式排除该依赖项。


推荐