[英]How do I exclude all instances of a transitive dependency when using 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
傳遞依賴項的源代碼,然后在我的dependencies
項塊中有單獨的compile foo { exclude slf4j... }
語句。
更新:
我也試過這個:
configurations {
runtime.exclude name: "slf4j-log4j12"
}
最終排除了構建中的所有內容! 好像我指定了group: "*"
。
更新 2:
我為此使用 Gradle 1.10 版。
啊,以下工作並做我想要的:
configurations {
runtime.exclude group: "org.slf4j", module: "slf4j-log4j12"
}
似乎Exclude Rule只有兩個屬性 - group
和module
。 但是,上述語法並不阻止您將任意屬性指定為謂詞。 嘗試從單個依賴項中排除時,您不能指定任意屬性。 例如,這失敗了:
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 概念,我理解它在 Gradle 中轉換為 group:name:version。 但是,我怎么知道一個特定的 Maven 工件屬於哪個模塊(在 gradle 中)?
要全局排除一個或多個庫,請將以下內容添加到 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 塊有兩個屬性group和module 。 對於那些來自 maven 背景的人, group與groupId相同, module與artifactId相同。 示例:要排除 com.mchange:c3p0:0.9.2.1 以下應該是 exclude 塊
exclude group:"com.mchange", module:"c3p0"
你的方法是正確的。 (根據情況,您可能想要使用configurations.all { exclude ... }
。)如果這些排除確實排除了多個依賴項(我在使用它們時從未注意到),請在http://forums.gradle.org ,最好有一個可重現的例子。
在下面的例子中,我排除了
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'
}
我正在使用 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: ''
}
這是針對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")
}
}
compile
已棄用,取而代之的是implementation
。 因此,對於那些運行較新版本 gradle 的解決方案:
implementation("org.springframework.boot:spring-boot-starter-web") {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.