我的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版本。
8条答案
按热度按时间wr98u20j1#
以下是我想要的工作和功能:
Exclude Rule似乎只有两个属性:
group
和module
。因此,为了只从单个依赖项中排除,我们可以这样做:
然而,上面的语法并不阻止你指定任意属性作为 predicate 。当尝试从单个依赖项中排除时,不能指定任意属性。例如,这将失败:
与
因此,即使您可以使用
group:
和name:
指定依赖项,也不能使用name:
指定排除项!?!也许这是一个单独的问题,但是什么是模块呢?我可以理解groupId:artifactId:version的Maven概念,我理解它在Gradle中翻译为group:name:version。但是,我怎么知道一个特定的Maven工件属于哪个模块(用gradle的话说)呢?
tpxzln5u2#
要全局排除一个或多个库,请将以下内容添加到您的build.gradle
现在exclude块有两个属性group和module。对于那些来自maven背景的人,group与groupId相同,module与artifactId相同。示例:要排除com.mchange:c3p0:0.9.2.1,以下内容应排除块
9rbhqvlz3#
你的方法是正确的。(根据具体情况,您可能希望使用
configurations.all { exclude ... }
。)如果这些排除真的排除了多个依赖项(我在使用它们时从未注意到这一点),请在http://forums.gradle.org处提交一个bug,最好是一个可重现的示例。ippsafx74#
在下面的例子中,我排除了
Spring起动机
bzzcjhmw5#
我使用的是spring Boot 1.5.10,并试图排除logback,上面给出的解决方案效果不好,我使用配置代替
i86rm4rw6#
除了@berguiga-mohamed-amine所说的,我刚刚发现一个函数需要将模块参数保留为空字符串:
c0vxltue7#
compile
已被弃用,并被implementation
取代。因此,对于那些运行较新版本的gradle的用户来说,解决方案是:o2gm4chl8#
这适用于Kotlin DSL(build.gradle.kts),可防止您使用错误的属性。
从所有配置(
implementation
、runtimeOnly
等)中删除库:从单个配置重新配置库(如
implementation
):为单个依赖项重新配置库: