我仔细阅读了 那些文件,没有发现任何有关它的用途的内容。
Shade: shade Mojo 有很好的文档说明,特别是关于 createDependencyReducedPom参数,它将创建 dependency-reduced-pom.xml文件: maven-shade-plugin/shade-mojo.html#createDependencyReducedPom
createDependencyReducedPom
dependency-reduced-pom.xml
maven-shade-plugin/shade-mojo.html#createDependencyReducedPom
简而言之,如果您打算使用那个带阴影的 JAR (而不是普通的 JAR)作为另一个模块的依赖项,那么这非常有用。那个 dependency-reduced-pom.xml将不包含已经存在于阴影中的 JAR,避免了无用的重复。
I read the 医生 about a hundred times or so and still couldn't understand what this is for, what really is the use case for it.
最后,我是这样想的: 假设您有一个具有依赖项 A、 B、 C、 D、 E 的项目。在 pom.xml中,你可以通过这样的方式来配置阴影插件: 当它创建一个超级罐(称为 foo.jar)时,它在阴影罐中包含 A、 B、 C,但是出于某种原因,你决定不在阴影罐中包含 D、 E,即使你的项目依赖于它们——一个恰当的例子就是仅用于测试的依赖(例如,任何具有 scope的 test并且不包含在阴影罐中的依赖)。dependency-reduced-pom.xml将在其中定义 D、 E。这个想法是,如果有人想使用 foo.jar的 dependency-reduced-pom.xml提供了一个提示,一些排序,小心 foo.jar是缺少依赖关系 D,E 在它-使用在您自己的风险。然后,您可能决定在使用 foo.jar的项目中显式地添加 D,E。
pom.xml
foo.jar
scope
test
因此,dependency-reduced-pom.xml更像 missing-dependencies.xml,它列出了 uber-jar 中缺少的依赖项,uber-jar 由阴影插件输出。
missing-dependencies.xml
简短的回答
Xml 删除了已经存在于您的阴影 jar 中的传递依赖项,这样可以防止使用者将它们放入两次。
长答案
给罐子涂上阴影有几个原因。
如果您正在生成一个可执行的 jar,它的所有依赖项都捆绑在一起,那么您可能正在将它上传到一个包存储库,而用户正在手动下载它。在这个场景中,依赖减少的 pom.xml 不会为您做任何事情。
另一个原因是,您正在构建一个库,并且正在使用其他公共库的特定版本。您不希望强制用户使用与您相同的版本。通过阴影,可以有效地对这些依赖项进行命名,然后用户可以再次包含相同的库,但是版本不同。
在这种情况下,如果您上传原始的 pom,那么依赖于您的库的用户最终将两次拉入所有依赖项。一次从阴影的副本和一次从副本声明的波姆。相反,上传依赖项减少的 pom.xml 可以防止这种情况发生,因为阴影的依赖项声明被删除了。
dependency-reduced-pom.xml的目的是向您展示您正在准备的工件的最终依赖集是什么。
假设艺术品 X依赖于 A和 B。通过将 B依赖关系嵌入 maven-shadow-plugin,我们创建了一个只依赖于 A的工件,这是 dependency-reduced-pom.xml将告诉您的(B依赖关系将不在该文件中)。这是将安装在 Maven 存储库中的文件,而不是原来的 pom.xml。它将用于计算工件 X的依赖集,因此如果任何其他模块依赖于 X,它将不依赖于 B。
X
A
B