我阅读了文档,但没有找到任何关于它用途的内容。
shade:shade Mojo 有很好的文档记录,这里特别是关于
createDependencyReducedPom
参数,它将创建 dependency-reduced-pom.xml
文件:maven-shade-plugin/shade-mojo.html#createDependencyReducedPom
简而言之,如果您打算使用该阴影 JAR(而不是普通 JAR)作为另一个模块的依赖项,这非常有用。
dependency-reduced-pom.xml
不会包含阴影中已存在的 JAR,从而避免无用的重复。
我阅读了 docs 大约一百遍左右,但仍然无法理解它的用途,它的真正用例是什么。
最后这就是我的想法:假设您有一个具有依赖项 A、B、C、D、E 的项目。在
pom.xml
中,您以这样的方式配置阴影插件,当它创建 uber-jar (调用它foo.jar
),它在阴影 jar 中包含 A、B、C,但由于某种原因,您决定不在阴影 jar 中包含 D、E,即使您的项目依赖于它们 - 一个典型的例子是需要的依赖项仅用于测试(例如,任何具有 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 中缺少的依赖项。
简短回答
dependency-reduced-pom.xml 删除了阴影 jar 中已有的传递依赖项。这可以防止消费者两次拉它们。
长答案
给罐子遮荫有几个原因。
如果您正在生成一个捆绑了所有依赖项的可执行 jar,那么您可能会将其上传到包存储库,并且用户正在手动下载它。在这种情况下,dependency-reduced-pom.xml 不会为您做任何事情。
另一个原因是因为您正在构建一个库并且正在使用其他公共库的特定版本。您不想强迫您的用户使用与您相同的版本。通过着色,您可以有效地命名这些依赖项,然后您的用户可以再次包含相同的库,但版本不同。
在这种情况下,如果您上传原始 pom,那么依赖您的库的用户最终将拉取所有依赖项两次。一次来自阴影副本,一次来自 pom 中声明的副本。相反,上传 dependency-reduced-pom.xml 可以防止这种情况发生,因为阴影依赖项声明已被删除。
dependency-reduced-pom.xml
的目的是向您展示您正在准备的工件的最终依赖集是什么。
假设神器
X
取决于A
和B
。通过使用 maven-shade-plugin 嵌入 B
依赖项,我们创建了一个仅依赖于 A
的工件,这就是 dependency-reduced-pom.xml
会告诉您的内容(B
依赖项不会在该文件中)。这是将安装在 Maven 存储库中的文件,而不是原始的 pom.xml
。它将用于计算工件X
的依赖集,因此如果任何其他模块依赖于X
,它将不依赖于B
。
对于生成的任何 uber jar
dependency-reduced-pom.xml
将包含运行时提供程序提供的依赖项。为了简单地理解在 tomcat 中运行应用程序时,您可能不需要提供包含 Servlet.class 依赖项等类的 Servlet jar。它将由选定的运行时环境提供。
我添加了其他答案中缺少的重要一点,它说明了
dependency-reduced-pom.xml
的目的。
如果您使用例如部署并发布您的着色 jar
central-publishing-maven-plugin
,插件将默认使用 jar 部署 dependency-reduced-pom.xml
(不是 pom.xml
)。
这是因为您不希望 Maven 中央工件声明外部依赖项:您的 jar 中已经有这些依赖项。