在使用Gradle时,如何排除传递依赖的所有示例?

tzdcorbm  于 2023-10-19  发布在  其他
关注(0)|答案(8)|浏览(127)

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

更新二:

我使用的是Gradle 1.10版本。

wr98u20j

wr98u20j1#

以下是我想要的工作和功能:

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

然而,上面的语法并不阻止你指定任意属性作为 predicate 。当尝试从单个依赖项中排除时,不能指定任意属性。例如,这将失败:

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的话说)呢?

tpxzln5u

tpxzln5u2#

要全局排除一个或多个库,请将以下内容添加到您的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"
9rbhqvlz

9rbhqvlz3#

你的方法是正确的。(根据具体情况,您可能希望使用configurations.all { exclude ... }。)如果这些排除真的排除了多个依赖项(我在使用它们时从未注意到这一点),请在http://forums.gradle.org处提交一个bug,最好是一个可重现的示例。

ippsafx7

ippsafx74#

在下面的例子中,我排除了
Spring起动机

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

bzzcjhmw5#

我使用的是spring Boot 1.5.10,并试图排除logback,上面给出的解决方案效果不好,我使用配置代替

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

i86rm4rw6#

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

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

c0vxltue7#

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

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

o2gm4chl8#

这适用于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")
    }
}

相关问题