Gradle不会按要求排除模块

时间:2014-09-23 11:30:28

标签: android android-gradle build.gradle

我无法使用"排除"在build.gradle文件中排除番石榴模块。

使用此依赖块:

dependencies {
    ...
    compile(group: 'com.google.api-client', name: 'google-api-client', version: '1.19.0') {
        exclude(group: 'com.google.guava', module: 'guava-jdk5') // !!! Doesn't work!!!
       ...
    }
...
}

我得到下面的依赖树。请注意,不排除guava-jdk5。

+--- com.google.api-client:google-api-client:1.19.0
|    +--- com.google.oauth-client:google-oauth-client:1.19.0
|    |    +--- com.google.http-client:google-http-client:1.19.0
|    |    |    ...
|    |    \--- com.google.code.findbugs:jsr305:1.3.9
|    ...
|    \--- com.google.guava:guava-jdk5:13.0

...

请注意,最后一行仍包含番石榴模块,尚未排除。为什么?如何排除它?

2 个答案:

答案 0 :(得分:32)

问题是另一个编译对象也依赖于将guava-jdk5作为传递依赖的第一级依赖,因此这另一个对象引入了不需要的模块。

我终于可以使用

看到这一点
./gradlew -q :app:dependencyInsight --dependency guava --configuration compile

可以使用

排除它
configurations {
    compile.exclude module: 'guava-jdk5'
}

答案 1 :(得分:19)

问题作者的回答并没有帮助我,因为它太狭隘/具体。 这是一种经过修改的方法,适用于排除任何模块:

  1. 使用“终端”中的此命令检查当前识别的依赖项:

    gradlew app:dependencies
    
  2. 该命令是从项目的根目录发出的,此处的“app”应替换为应用程序“模块”的名称。

    您也可以在应用程序的文件夹中进行cd并启动它:

    ..\gradlew -q dependencies
    

    注意:在Linux上使用../gradle

    您将看到几个配置存在,而不仅仅是“编译”(例如“_debugCompile”等)。每个“配置”都有自己的依赖关系!这就是为什么在“编译”配置中排除某些内容可能还不够。

    1. 现在以这种方式对所有“配置”应用排除: 将此块添加到应用程序的(“模块”)gradle.build文件中(当前包含要排除的模块列表:-)):

      configurations {
          all {
              exclude module: 'httpclient'
              exclude module: 'httpcore'
          }
      }
      

      提示:讨论推进排除案例,例如:在这里:https://discuss.gradle.org/t/how-do-i-exclude-specific-transitive-dependencies-of-something-i-depend-on/17991/7

    2. 重复步骤1.和2.直到在任何配置的依赖关系列表中都没有看到要排除的模块。

    3. 提示:此处,在“所有”区块内,您可以决定放置:

      transitive = false
      

      你将摆脱所有传递依赖。