135

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

我想slf4j-log4j12从我构建的 jar 中全局排除 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 版。

4

8 回答 8

170

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

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", name: "slf4j-log4j12"
  }
}

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

group:因此,即使您可以使用 a 指定依赖项,但不能使用!?!name:指定排除项name:

也许是一个单独的问题,但是模块到底是什么?我可以理解 groupId:artifactId:version 的 Maven 概念,我理解它在 Gradle 中转换为 group:name:version。但是,我怎么知道一个特定的 Maven 工件属于哪个模块(在 gradle 中)?

于 2014-02-13T21:16:55.860 回答
51

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

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

现在 exclude 块有两个属性groupmodule。对于那些来自 maven 背景的人,groupgroupId相同,moduleartifactId相同。示例:要排除 com.mchange:c3p0:0.9.2.1 以下应该是排除块

exclude group:"com.mchange", module:"c3p0"
于 2017-03-21T08:03:06.260 回答
34

你的方法是正确的。(根据具体情况,您可能想使用configurations.all { exclude ... }.)如果这些排除项确实排除了多个依赖项(我在使用它们时从未注意到),请在http://forums.gradle.org提交错误,理想情况下有一个可重现的例子。

于 2014-02-13T20:07:19.763 回答
24

在下面的示例中,我排除了

spring-boot-starter-tomcat

compile("org.springframework.boot:spring-boot-starter-web") {
     //by both name and group
     exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' 
}
于 2015-12-08T12:29:03.950 回答
10

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

configurations.all {
    exclude group: "org.springframework.boot", module:"spring-boot-starter-logging"
}
于 2018-02-24T22:42:34.697 回答
6

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

compile ("com.github.jsonld-java:jsonld-java:$jsonldJavaVersion") {
    exclude group: 'org.apache.httpcomponents', module: ''
    exclude group: 'org.slf4j', module: ''
}
于 2019-03-24T11:51:20.750 回答
2

compile已弃用,并由implementation. 因此,对于那些运行较新版本的 gradle 的解决方案:

implementation("org.springframework.boot:spring-boot-starter-web") {
     exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' 
}
于 2021-11-20T12:59:04.280 回答
0

这是针对 Kotlin DSL (build.gradle.kts) 的,它可以防止您使用错误的属性。

从所有配置中排除该库(implementation,runtimeOnly等):

configurations.all {
    exclude(group = "ir.mahozad.android", module = "pie-chart")
    // OR exclude("ir.mahozad.android", "pie-chart")
}

// Another notation:
// configurations {
//     all {
//         exclude(group = "ir.mahozad.android", module = "pie-chart")
//     }
// }

从单个配置中排除库(如implementation):

configurations.implementation {
    exclude(group = "ir.mahozad.android", module = "pie-chart")
}

// Another notation:
// configurations {
//     implementation {
//         exclude(group = "ir.mahozad.android", module = "pie-chart")
//     }
// }

排除单个依赖项的库:

dependencies {
    // ...
    implementation("ir.mahozad.android:charts:1.2.3") {
        exclude(group = "ir.mahozad.android", module = "pie-chart")
    }
}
于 2022-02-12T11:45:03.543 回答