Gradle不会按要求排除模块

aez*_*aez 34 android build.gradle android-gradle-plugin

我不能使用"exclude"在build.gradle文件中排除guava模块.

使用此依赖项块:

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!!!
       ...
    }
...
}
Run Code Online (Sandbox Code Playgroud)

我得到下面的依赖树.请注意,不排除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
Run Code Online (Sandbox Code Playgroud)

...

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

aez*_*aez 32

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

我终于可以看到这个了

./gradlew -q :app:dependencyInsight --dependency guava --configuration compile
Run Code Online (Sandbox Code Playgroud)

并可以使用它排除它

configurations {
    compile.exclude module: 'guava-jdk5'
}
Run Code Online (Sandbox Code Playgroud)


yvo*_*olk 19

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

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

    gradlew app:dependencies
    
    Run Code Online (Sandbox Code Playgroud)

该命令是从项目的根目录发出的,此处的"app"应替换为应用程序"模块"的名称.

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

..\gradlew -q dependencies
Run Code Online (Sandbox Code Playgroud)

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

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

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

    configurations {
        all {
            exclude module: 'httpclient'
            exclude module: 'httpcore'
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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

提示:在这里,在"所有"区块内,您可以决定放置:

transitive = false
Run Code Online (Sandbox Code Playgroud)

你将摆脱所有传递依赖.