我阅读了文档并没有找到任何关于它的用途的内容。
4 回答
shade:shade Mojo 有很好的文档记录,特别是关于createDependencyReducedPom
参数,它将创建该dependency-reduced-pom.xml
文件:maven-shade-plugin/shade-mojo.html#createDependencyReducedPom
简而言之,如果您打算使用该阴影 JAR(而不是普通 JAR)作为另一个模块的依赖项,这将非常有用。这dependency-reduced-pom.xml
将不包含阴影中已经存在的 JAR,从而避免了无用的重复。
我阅读了大约一百遍文档,但仍然无法理解它的用途,它的真正用例是什么。
最后,这就是我的想法:假设您有一个具有依赖项 A、B、C、D、E 的项目。在pom.xml
您配置 shade 插件时,当它创建 uber-jar(调用它foo.jar
)时,它在阴影 jar 中包含 A、B、C,但由于某种原因,您决定不在阴影 jar 中包含 D、E,即使您的项目依赖于它们 - 一个例子是仅用于测试的依赖项(例如任何依赖项有一个scope
oftest
并且不包含在阴影 jar 中)。将dependency-reduced-pom.xml
在其中定义 D、E。这个想法是,如果有人想使用foo.jar
提供dependency-reduced-pom.xml
某种提示,请注意其中foo.jar
缺少依赖项 D、E - 使用风险自负。然后,您可能决定在将使用的项目中显式添加 D、Efoo.jar
.
因此,dependency-reduced-pom.xml
它更像missing-dependencies.xml
并列出了 shade 插件输出的 uber-jar 中缺少的依赖项。
简答
dependency-reduced-pom.xml 删除了已经在你的阴影 jar 中的传递依赖。这可以防止消费者将他们拉进来两次。
长答案
遮蔽罐子有几个原因。
如果您正在生成一个捆绑了所有依赖项的可执行 jar,那么您可能正在将其上传到包存储库,而用户正在手动下载它。在这种情况下,dependency-reduced-pom.xml 不会为您做任何事情。
另一个原因是因为您正在构建一个库并且正在使用其他公共库的特定版本。您不想强迫用户使用与您相同的版本。通过着色,您可以有效地命名这些依赖项,然后您的用户可以再次包含相同的库,但在不同的版本上。
在这种情况下,如果您上传原始 pom,那么依赖您的库的用户最终将两次拉取所有依赖项。一次来自阴影副本,一次来自 pom 中声明的副本。上传 dependency-reduced-pom.xml 可以防止这种情况发生,因为阴影的依赖声明已被删除。
的目的dependency-reduced-pom.xml
是向您展示您正在准备的工件的最终依赖集是什么。
假设工件X
取决于A
and B
。通过使用 maven-shade-plugin 嵌入B
依赖项,我们创建了一个仅依赖于的工件,A
这dependency-reduced-pom.xml
将告诉您(B
依赖项不会在该文件中)。这是将安装在 Maven 存储库中的文件,而不是原来的pom.xml
. 它将用于计算工件的依赖集X
,因此如果任何其他模块依赖X
它,它将不依赖B
。