如何排除传递依赖关系的所有实例时使用划分?

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

我希望在全局范围内排除构建的罐子中的 slf4j-log4j12罐子,所以我尝试了以下方法:

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

然而,这似乎排除了包括 slf4j-api在内的 所有 org.slf4j工件:

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"
}

最终从构建中排除了 一切! 就好像我指定了 group: "*"一样。

更新2:

我使用的是1.10版本。

207419 次浏览

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

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

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"
}
}

但是,上述语法并不妨碍您将任何任意属性指定为谓词。当试图从单个依赖项中排除时,不能指定任意属性。例如,这种做法失败了:

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:指定一个排除项! ? !

也许这是一个单独的问题,但是什么是 没错呢?我能理解 Maven 的 groupId: artifactId: version 的概念,我能理解它在 Gradle 的翻译是 group: name: version。但是,我如何知道一个特定的 Maven 工件属于哪个模块(用分级术语)呢?

在下面的例子中我排除

弹簧-靴子-启动器-公猫

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"
}

现在排除块有两个属性 小组模组。对于那些来自美文背景,小组是相同的 GroupId模组是相同的 艺术品。 示例: 要排除 com.mchange: c3p0:0.9.2.1,下面应该是排除块

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

我使用的是 Spring boot 1.5.10并尝试排除 logback,上面给定的解决方案不能很好地工作,我改用配置

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

除了@berguiga-mohamed-amine 声明的内容之外,我还发现通配符需要将模块参数保留为空字符串:

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

compile已被废弃,取而代之的是 implementation。因此,对于那些运行较新版本的 gradle 的人来说,解决方案是:

implementation("org.springframework.boot:spring-boot-starter-web") {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}

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

从所有配置(implementationruntimeOnly等)中排除该库:

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")
}
}