如何在使用Gradle时排除所有传递依赖的实例?

我的gradle项目使用application插件来构build一个jar文件。 作为运行时传递依赖的一部分,我最终得到了org.slf4j:slf4j-log4j12 。 (在至less5或6个其他传递依赖项中,它被引用为子传递依赖项 – 这个项目使用了spring和hadoop,所以除了厨房水槽以外的所有东西都被拉进了…不等待…那里也是:) )。

我想从我的内置jar中全局排除slf4j-log4j12 jar。 所以我试过这个:

 configurations { runtime.exclude group: "org.slf4j", module: "slf4j-log4j12" } 

但是,这似乎排除包括slf4j-api在内的所有 org.slf4j构件。 在debugging模式下运行时,我看到如下行:

 org.slf4j#slf4j-api is excluded from com.pivotal.gfxd:gfxd-demo-mapreduce:1.0(runtime). org.slf4j#slf4j-simple is excluded from com.pivotal.gfxd:gfxd-demo-mapreduce:1.0(runtime). org.slf4j#slf4j-log4j12 is excluded from org.apache.hadoop:hadoop-common:2.2.0(runtime). 

我不想查找每个slf4j-log4j12传递依赖的来源,然后在我的dependencies块中单独compile foo { exclude slf4j... }语句。

更新:

我也试过这个:

 configurations { runtime.exclude name: "slf4j-log4j12" } 

最后排除了构build的一切 ! 就像我指定的group: "*"

更新2:

我正在使用Gradle版本1.10。

啊,下面的工作,做我想要的:

 configurations { runtime.exclude group: "org.slf4j", module: "slf4j-log4j12" } 

似乎排除规则只有两个属性 – groupmodule 。 但是,上面的语法不会阻止您将任何属性指定为谓词。 当试图从个体依赖中排除时,你不能指定任意属性。 例如,这失败了:

 dependencies { compile ('org.springframework.data:spring-data-hadoop-core:2.0.0.M4-hadoop22') { exclude group: "org.slf4j", module: "slf4j-log4j12" } } 

 No such property: name for class: org.gradle.api.internal.artifacts.DefaultExcludeRule 

所以即使你可以用一个group:name:来指定一个依赖name:你不能用一个name:来指定一个排除name: !?!

也许是一个单独的问题,但究竟是一个模块呢? 我可以理解groupId:artifactId:version的Maven概念,我知道它转换为Gradle中的group:name:version。 但是,那么我怎么知道一个特定的Maven神器属于哪个模块?

你的方法是正确的。 (根据具体情况,你可能需要使用configurations.all { exclude ... } 。)如果这些排除了不止一个依赖项(我从来没有注意到使用它们的时候),请提交一个bug http://forums.gradle.org ,最好有一个可重复的例子。

在下面的例子中我排除

弹簧引导起动的tomcat

 compile("org.springframework.boot:spring-boot-starter-web") { //by both name and group exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' } 

要全局排除一个或多个库,请将以下内容添加到build.gradle

 configurations.all { exclude group:"org.apache.geronimo.specs", module: "geronimo-servlet_2.5_spec" exclude group:"ch.qos.logback", module:"logback-core" } 

现在,排除块有两个属性模块 。 对于来自maven背景的人, groupgroupId是一样的, moduleartifactId是一样的。 例如:要排除com.mchange:c3p0:0.9.2.1以下应该是排除块

 exclude group:"com.mchange", module:"c3p0"