【问题标题】:What is the purpose of dependency-reduced-pom.xml generated by the shade plugin?shade插件生成的dependency-reduced-pom.xml的目的是什么?
【发布时间】:2014-05-19 05:35:30
【问题描述】:

我阅读了the docs 并没有找到任何关于它的用途的内容。

【问题讨论】:

标签: java maven maven-shade-plugin


【解决方案1】:

shade:shade Mojo 有很好的文档记录,特别是关于 createDependencyReducedPom 参数,它将创建 dependency-reduced-pom.xml 文件:maven-shade-plugin/shade-mojo.html#createDependencyReducedPom

简而言之,如果您打算使用该阴影 JAR(而不是普通 JAR)作为另一个模块的依赖项,这将非常有用。 dependency-reduced-pom.xml 不会包含阴影部分中已经存在的 JAR,从而避免了无用的重复。

【讨论】:

  • 我不确定我是否同意关于 mvn 的任何内容都有据可查,该技术天生就难以理解。了解如何使用 dependency-reduced-pom.xml 会很有帮助。应该在哪里以及如何使用它。
  • 上面,@ScottBoring 询问应该在哪里添加设置。它位于配置块中,the maven shade plugin usage page 上的插件定义中有该块的示例。
  • 但是,当你依赖于阴影 jar 时,你如何让它使用 drp 呢?
  • 如果配置为创建(例如安装和部署阶段),插件是否不使用该drp作为项目pom?
  • @JeremyD 他不是在问在哪里使用该设置,而是在问在哪里使用生成的 POM。
【解决方案2】:

我读了docs 大约一百遍,但仍然无法理解它的用途,它的真正用例是什么。

最后这就是我的想法:假设您有一个具有依赖项 A、B、C、D、E 的项目。在 pom.xml 中,您配置 shade 插件的方式是在创建 uber-jar 时(称为foo.jar),它在阴影 jar 中包含 A、B、C,但由于某种原因,您决定不在阴影 jar 中包含 D、E,即使您的项目依赖于它们 - 一个典型的例子是依赖关系仅用于测试(例如,任何具有testscope 且不包含在阴影jar 中的依赖项)。 dependency-reduced-pom.xml 将在其中定义 D、E。这个想法是,如果有人想使用 foo.jar dependency-reduced-pom.xml 提供某种提示,请注意 foo.jar 缺少依赖项 D、E - 使用风险自负。然后,您可能决定在将使用 foo.jar 的项目中显式添加 D、E。

所以dependency-reduced-pom.xml 更像missing-dependencies.xml 并列出了阴影插件输出的 uber-jar 中缺少的依赖项。

【讨论】:

  • 您能否确认随着时间的推移,这种理解是否正确?
【解决方案3】:

简答

dependency-reduced-pom.xml 删除已在阴影 jar 中的传递依赖项。这可以防止消费者将他们拉进来两次。

长答案

遮蔽罐子有几个原因。

如果您正在生成一个捆绑了所有依赖项的可执行 jar,那么您可能正在将其上传到包存储库,而用户正在手动下载它。在这种情况下,dependency-reduced-pom.xml 不会为您做任何事情。

另一个原因是因为您正在构建一个库并且正在使用其他公共库的特定版本。您不想强迫用户使用与您相同的版本。通过着色,您可以有效地命名这些依赖项,然后您的用户可以再次包含相同的库,但在不同的版本上。

在这种情况下,如果您上传原始 pom,那么依赖您的库的用户最终将两次拉取所有依赖项。一次来自阴影副本,一次来自 pom 中声明的副本。上传 dependency-reduced-pom.xml 可以防止这种情况发生,因为阴影的依赖声明已被删除。

【讨论】:

  • 我们应该提交这个文件还是忽略它?谢谢
  • @Madeo 的经验法则是不提交从构建过程中创建的任何内容。它将在每次构建时重新创建,因此可以安全地忽略。提交它会导致额外的不必要的提交。
【解决方案4】:

dependency-reduced-pom.xml 的目的是向您展示您正在准备的工件的最终依赖集是什么。

假设工件X 依赖于AB。通过使用 maven-shade-plugin 嵌入 B 依赖项,我们创建了一个仅依赖于 A 的工件,这就是 dependency-reduced-pom.xml 将告诉您的内容(B 依赖项不会在该文件中)。这是将安装在 Maven 存储库中的文件,而不是原来的 pom.xml。它将用于计算工件X 的依赖集,因此如果任何其他模块依赖于X,它将不依赖于B

【讨论】:

    猜你喜欢
    • 2012-07-04
    • 2014-12-17
    • 2016-05-11
    • 2015-03-23
    • 2015-01-14
    • 2018-06-09
    • 2014-07-27
    • 2018-03-20
    • 2018-02-08
    相关资源
    最近更新 更多