我的gradle项目使用该application插件构建了一个jar文件。作为运行时传递依赖项的一部分,我最后引入org.slf4j:slf4j-log4j12。(在至少5或6个其他可传递依赖项中被称为子传递依赖项-该项目正在使用spring和hadoop,因此除了厨房水槽之外的所有东西都被拉进来了…等一下…那里也是:) )。
application
org.slf4j:slf4j-log4j12
我想slf4j-log4j12从我的内置jar中全局排除该jar。所以我尝试了这个:
slf4j-log4j12
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块中包含单独的语句。
compile foo { exclude slf4j... }
dependencies
更新:
我也尝试过这样:
configurations { runtime.exclude name: "slf4j-log4j12" }
最终排除了构建中的所有内容!好像我指定了group: "*"。
group: "*"
更新2:
我为此使用Gradle版本1.10。
configurations { runtime.exclude group: "org.slf4j", module: "slf4j-log4j12" }
排除规则似乎只有两个属性- group和module。但是,以上语法不会阻止你将任意属性指定为谓词。尝试从单个依赖项中排除时,你不能指定任意属性。例如,这失败了:
group
module
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工件属于哪个模块(以讲授方式)?