shade插件生成的dependency-reduced-pom.xml的目的是什么?

时间:2014-04-07 05:55:21

标签: java maven maven-shade-plugin

我读过the docs并没有发现任何有关它用于什么的内容。

3 个答案:

答案 0 :(得分:37)

阴影:阴影Mojo有详细记录,特别是createDependencyReducedPom参数,它将创建dependency-reduced-pom.xml文件:maven-shade-plugin/shade-mojo.html#createDependencyReducedPom

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

答案 1 :(得分:14)

我读了docs大约一百次左右,但仍然无法理解这是什么,它的用例究竟是什么。

最后这就是我的想法:假设你有一个带有依赖关系A,B,C,D,E的项目。在pom.xml中你以这样的方式配置阴影插件,当它创建优步时-jar(称之为foo.jar),它在阴影罐中包含A,B,C但由于某种原因你决定不在阴影罐中包含D,E,即使你的项目依赖于它们 - 一个案例point是仅用于测试的依赖项(例如,具有scope test并且未包含在着色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中缺少的依赖项。

答案 2 :(得分:5)

简答

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

长答案

给罐子遮阴有几个原因。

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

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

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