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

新手上路,请多包涵

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

我想从我构建的 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 6656 中有单独的 compile foo { exclude slf4j... } 语句

更新:

我也试过这个:

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

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

更新 2:

我为此使用 Gradle 1.10 版。

原文由 Jens D 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

啊,下面的工作和做我想要的:

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


但是,上述语法不会阻止您将任意属性指定为谓词。尝试从单个依赖项中排除时,您不能指定任意属性。例如,这失败了:

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

原文由 Jens D 发布,翻译遵循 CC BY-SA 4.0 许可协议

要全局排除一个或多个库,请将以下内容添加到您的 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 背景的人, groupId 相同, 模块artifactId 相同。示例:排除 com.mchange:c3p0:0.9.2.1 以下应该是排除块

exclude group:"com.mchange", module:"c3p0"

原文由 venom.unleashed 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题