2014-09-23 50 views
33

我无法使用“exclude”排除build.gradle文件中的guava模块。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 

...

注意,最后一行还包括番石榴模块,它并没有被排除在外。为什么?如何排除它?

回答

31

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

我能终于看到了这一点使用

./gradlew -q :app:dependencyInsight --dependency guava --configuration compile 

,并可能使用

configurations { 
    compile.exclude module: 'guava-jdk5' 
} 
+1

我们如何从包中排除特定类 – Ajay 2016-10-19 13:26:01

+0

@Ajay你不能在Gradle中做到这一点。您只能排除传递依赖关系,而不能从这些依赖关系或传递依赖关系中指定特定的类或包。 – sversch 2017-11-17 06:54:15

18

对这个问题的作者的回答并不能帮助我排除它,因为它太狭窄/混凝土。 这是一种改性的方法,它适用于任何模块排除:在“终端”使用此命令

  1. 检查目前公认的依赖关系:

    gradlew app:dependencies 
    

的命令是从发出您的项目的根目录和“应用程序”应该替换为应用程序“模块”的名称。

您也可以CD应用程序的文件夹内,并推出这样的:

..\gradlew -q dependencies 

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

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

  • 现在申请排除所有“配置”是这样的: 将此块添加到您的应用程序(“模块”)gradle.build文件(你的模块排除列表,当然:-)):

    configurations { 
        all { 
         exclude module: 'httpclient' 
         exclude module: 'httpcore' 
        } 
    } 
    
  • 重复步骤1和2,直到看不到模块,这要排除在任何配置的依赖关系的列表。

  • 提示:在这里,里面的“所有”块,你可以决定将:

    transitive = false 
    

    你会摆脱所有传递依赖的。

    +0

    你不应该也使用'group:'com.some.group''吗? – 2016-08-08 18:12:32