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

时间:2014-02-13 19:49:24

标签: java gradle

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

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

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

但是,这似乎排除了所有 org.slf4j工件,包括slf4j-api。在调试模式下运行时,我会看到如下行:

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传递依赖项的来源,然后在compile foo { exclude slf4j... }块中添加单独的dependencies语句。

更新

我也试过这个:

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

最终不包括构建中的所有内容!好像我指定了group: "*"

更新2:

我正在使用Gradle版本1.10。

6 个答案:

答案 0 :(得分:116)

啊,以下工作并做我想做的事:

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

Exclude Rule似乎只有两个属性 - groupmodule。但是,上述语法不会阻止您将任意属性指定为谓词。尝试从单个依赖项中排除时,您无法指定任意属性。例如,这失败了:

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

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

因此,即使您可以使用group:name:指定依赖项,也无法使用name:指定排除项!?

也许是一个单独的问题,但完全模块呢?我可以理解groupId:artifactId:version的Maven概念,我理解它转换为group:name:Gradle中的版本。但是,我如何知道特定Maven工件属于哪个模块(以gradle-speak方式)?

答案 1 :(得分:29)

要全局排除一个或多个库,请将以下内容添加到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背景的人, groupId 相同,模块 artifactId 相同。 示例:要排除com.mchange:c3p0:0.9.2.1以下应该是排除块

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

答案 2 :(得分:26)

你的方法是正确的。 (根据具体情况,您可能希望使用configurations.all { exclude ... }。)如果这些排除实际上排除了多个依赖项(我在使用它时没有注意到),请在{{3}处提交错误理想情况下,有一个可重复的例子。

答案 3 :(得分:16)

在下面的示例中我排除了

  

弹簧引导起动的Tomcat

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

答案 4 :(得分:3)

我正在使用spring boot 1.5.10并尝试排除logback,上面给出的解决方案效果不好,我使用的是配置

configurations.all {
    exclude group: "org.springframework.boot", module:"spring-boot-starter-logging"
}

答案 5 :(得分:1)

除了@ berguiga-mohamed-amine所说的以外,我刚刚发现通配符需要将模块参数留空字符串:

compile ("com.github.jsonld-java:jsonld-java:$jsonldJavaVersion") {
    exclude group: 'org.apache.httpcomponents', module: ''
    exclude group: 'org.slf4j', module: ''
}