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

123
我阅读了 该文档,没有找到关于它的用途的任何说明。

2
在Mojo文档中难道不相对清晰吗:http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html#createDependencyReducedPom ? - Tome
10
不,里面没有关于它的目的的内容。 - Transcendence
6
如果你有一个依赖于X的模块A,并在特定的JAR文件(A-shaded.jar)中去除了其中一些依赖关系,那么如果你想依赖于A-shaded.jar而不是A.jar,就不需要这些已经去除的依赖关系。因此,该插件会创建一个仅包含Y个非阴影依赖项的pom.xml文件。 - Tome
1
我理解这个去除依赖的POM文件包含了什么。我很好奇是否有人可以描述一个现实生活中的工作流程,他们在其中使用了这个去除依赖的POM文件。 - Garret Wilson
5个回答

63

阴影(shade):shade Mojo文档相当完善,尤其是关于createDependencyReducedPom参数的部分,它将创建dependency-reduced-pom.xml文件: maven-shade-plugin/shade-mojo.html#createDependencyReducedPom

简而言之,如果您打算将那个被阴影处理过的JAR(而不是正常的JAR)作为另一个模块的依赖使用,那么这非常有用。 那个dependency-reduced-pom.xml将不包含已经存在于阴影JAR中的JAR,避免无用的重复。


72
我不确定我同意 mvn 的任何信息都有很好的文档,这项技术本质上很难理解。了解如何使用 dependency-reduced-pom.xml 会很有帮助。它应该在哪里和如何使用? - Scott Boring
1
上面,@ScottBoring问设置应该添加在哪里。它应该放在配置块中,在maven shade插件使用页面的插件定义中有一个示例。 - Jeremy D
7
当你依赖于有遮蔽的罐子时,你如何让它使用drp呢? - OrangeDog
如果插件被配置为创建(例如用于安装和部署阶段),那么插件不会使用该drp作为项目pom吗? - Tome
4
他不是在问如何使用设置,他在问在哪里使用生成的POM。 - Shannon

37
我读了大约一百次关于maven shade插件中createDependencyReducedPom的文档,但仍然不明白它的用途是什么,实际上这个插件有什么用处。
最后我认为:假设你有一个依赖于A、B、C、D和E的项目。在pom.xml文件中,你配置shade插件的方式是当它创建uber-jar(称之为foo.jar)时,在shaded jar中包含A、B、C,但由于某种原因,你决定不在shaded jar中包含D、E,即使你的项目依赖于它们-这是测试所需的依赖项(例如任何具有test范围并且未包含在shaded 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,列出了shade插件生成的uber-jar中缺失的依赖项。

10
您能确认随着时间的推移,这种理解是否被证明是正确的吗? - MsA

13

简短回答

dependency-reduced-pom.xml文件会移除已在你的shaded jar中的传递依赖,以防止使用者重复引入它们。

详细回答

有几个原因可以对jar文件进行shading。

如果你正在生成一个可执行Jar包,并将所有依赖项打包在里面,那么你可能会将其上传到软件包管理库,用户手动下载。在这种情况下,dependency-reduced-pom.xml文件对你来说没有任何作用。

另一个原因是,因为你正在构建一个库并且正在使用其他常见库的特定版本。你不想强制你的用户使用与你相同的版本。通过Shading,你可以有效地给这些依赖项命名空间,然后你的用户可以再次包含相同的库,但是使用不同的版本。

在这种情况下,如果你上传原始的Pom文件,那么依赖于你的库的用户最终会从shaded副本和Pom中声明的副本中重复引入所有依赖项。相反,上传dependency-reduced-pom.xml文件可以防止这种情况发生,因为其中移除了shaded依赖项声明。


1
我们应该提交这个文件还是忽略它?谢谢。 - Matteo
2
@Madeo,经验法则是不要提交任何从构建过程中创建的内容。它将在每次构建时重新创建,因此可以安全地忽略它。提交它将导致额外的、不必要的提交。 - Rupert Madden-Abbott

1
dependency-reduced-pom.xml的目的是展示你正在准备的构件的最终依赖项集。假设构件X依赖于AB。通过使用maven-shade-plugin嵌入B依赖,我们创建了一个仅依赖于A的构件。这就是dependency-reduced-pom.xml会告诉你的内容(该文件中不会包含B依赖)。该文件将安装在Maven仓库中,以替换原始的pom.xml。在计算构件X的依赖项集时,它将被用于判断,因此如果任何其他模块依赖于X,它将不会依赖于B

0
任何生成的Uber Jar都将包含由运行时提供程序提供的已提供依赖项的dependency-reduced-pom.xml。简单地理解,当在Tomcat中运行应用程序时,您可能不需要提供Servlet jar,其中包含诸如Servlet.class依赖项之类的类。它将由所选的运行时环境提供。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接