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


104

我的gradle项目使用该application插件构建了一个jar文件。作为运行时传递依赖项的一部分,我最后引入org.slf4j:slf4j-log4j12。(在至少5或6个其他可传递依赖项中被称为子传递依赖项-该项目正在使用spring和hadoop,因此除了厨房水槽之外的所有东西都被拉进来了……不用等待...那里也有:) )。

我想slf4j-log4j12从我的内置jar中全局排除该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传递依赖项的来源,然后compile foo { exclude slf4j... }在我的代码dependencies块中包含单独的语句。

更新:

我也尝试过这样:

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

最终排除了构建中的所有内容!好像我指定了group: "*"

更新2:

我为此使用Gradle版本1.10。


2
您可能想接受问题的答案;这是礼貌。仓多在回答你的问题的兴趣
迈克尔Deardeuff

Answers:


136

嗯,以下方法可以满足我的要求:

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", 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工件属于哪个模块(以说说方式来说)?


1
对于Gradle论坛,这似乎是更好的讨论。
superEb 2014年


3
gh,我只是为这个确切的问题而苦恼。我发现用gradle做任何事情都非常困难,尤其是解决大型项目中的冲突时。我很乐意在gradle的dsl上使用带有xsd验证的详细xml
cjbooms

“名称:”应为“模块:”,那么它将适用于您:)
GuyK 2016年

1
为了将来我和其他人的利益,我想从我的战争包中排除所有依赖库(第3.3版)。因此,我没有列出每个清单,而是做了configurations { runtime.exclude group: '*' }
user1070304'3

39

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

1
谢谢,我明白了,他们本可以说模块的意思是名字
Remario '17

29

您的方法是正确的。(视情况而定,您可能要使用configurations.all { exclude ... }。)如果这些排除项确实排除了多个依赖项(我从未注意到使用它们时),请在http://forums.gradle.org上提交错误。,最好有一个可复制的示例。


1
configurations.all{}正是我想要的。谢谢你的帖子彼得
pczeus 16-4-22

20

在下面的示例中,我排除了

弹簧启动启动器tomcat

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

5

我使用的是Spring Boot 1.5.10,并尝试排除logback,上面给定的解决方案无法正常工作,我改用配置

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

3

除了@ berguiga-mohamed-amine所说的以外,我刚刚发现通配符需要将module参数保留为空字符串:

compile ("com.github.jsonld-java:jsonld-java:$jsonldJavaVersion") {
    exclude group: 'org.apache.httpcomponents', module: ''
    exclude group: 'org.slf4j', module: ''
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.