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

j91ykkif  于 2023-04-20  发布在  Maven
关注(0)|答案(5)|浏览(399)

我读了the docs,没有找到任何关于它的用途的东西。

e5nqia27

e5nqia271#

shade:shade Mojo有很好的文档,这里特别是关于createDependencyReducedPom参数,它将创建dependency-reduced-pom.xml文件:maven-shade-plugin/shade-mojo.html#createDependencyReducedPom
简而言之,如果您打算使用阴影JAR(而不是普通JAR)作为另一个模块的依赖项,这是非常有用的。该dependency-reduced-pom.xml将不包含阴影JAR中已经存在的JAR,避免无用的重复。

beq87vna

beq87vna2#

我读了大约一百遍的文档,仍然不能理解这是为了什么,它真正的用例是什么。
最后我是这样想的:假设你有一个依赖关系为A、B、C、D、E的项目。在pom.xml中,你可以这样配置shade插件,当它创建uber-jar时(称之为foo.jar),它在阴影jar中包括A,B,C,但出于某种原因,您决定不包括D,即使您的项目依赖于它们-一个恰当的例子是仅在测试时需要的依赖项(例如,具有testscope并且不包括在阴影jar中的任何依赖性)X1 m4n1x将定义D,这个想法是,如果有人想使用foo.jardependency-reduced-pom.xml提供了某种提示,注意foo.jar缺少依赖项D,然后你可能会决定在使用foo.jar的项目中显式地添加D,E。
所以dependency-reduced-pom.xml更像missing-dependencies.xml,它列出了shade插件输出的uber-jar中缺少的依赖项。

eaf3rand

eaf3rand3#

简答

dependency-reduced-pom.xml删除了已经在你的shaded jar中的可传递依赖。这可以防止消费者将它们拉入两次。

长答案

有几个原因来遮蔽一个jar。
如果你正在生成一个捆绑了所有依赖项的可执行jar,那么你可能会将它上传到一个包存储库,用户手动下载它。在这种情况下,dependency-reduced-pom.xml不会为你做任何事情。
另一个原因是因为你正在构建一个库,并且正在使用其他公共库的特定版本。你不想强迫你的用户使用与你相同的版本。通过阴影,你有效地命名了这些依赖项,然后你的用户可以再次包含相同的库,但在不同的版本上。
在这种情况下,如果你上传了原始的pom,那么依赖你的库的用户最终会两次拉入所有依赖项。一次是从阴影副本中拉入,一次是从pom中声明的副本中拉入。上传dependency-reduced-pom.xml可以防止这种情况发生,因为阴影依赖项声明被删除了。

zvms9eto

zvms9eto4#

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

v1uwarro

v1uwarro5#

对于任何uber jar生成的dependency-reduced-pom.xml将包含由运行时提供程序提供的依赖项。为了简单地理解在tomcat中运行应用程序时,您可能不需要提供包含Servlet.class依赖项等类的Servlet jar。它将由选定的运行时环境提供。

相关问题