簡體   English   中英

使用 Gradle 時如何排除傳遞依賴的所有實例?

[英]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只有兩個屬性 - 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 概念,我理解它在 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 塊有兩個屬性groupmodule 對於那些來自 maven 背景的人, groupgroupId相同, moduleartifactId相同。 示例:要排除 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) 的,它可以防止您使用錯誤的屬性。

從所有配置( 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")
    }
}

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM