一尘不染

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

java

我的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。


阅读 514

收藏
2020-03-19

共1个答案

一尘不染

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工件属于哪个模块(以讲授方式)?

2020-03-19