我阅读了 该文档,没有找到关于它的用途的任何说明。
阴影(shade):shade Mojo文档相当完善,尤其是关于createDependencyReducedPom
参数的部分,它将创建dependency-reduced-pom.xml
文件: maven-shade-plugin/shade-mojo.html#createDependencyReducedPom
简而言之,如果您打算将那个被阴影处理过的JAR(而不是正常的JAR)作为另一个模块的依赖使用,那么这非常有用。 那个dependency-reduced-pom.xml
将不包含已经存在于阴影JAR中的JAR,避免无用的重复。
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中缺失的依赖项。简短回答
dependency-reduced-pom.xml文件会移除已在你的shaded jar中的传递依赖,以防止使用者重复引入它们。
详细回答
有几个原因可以对jar文件进行shading。
如果你正在生成一个可执行Jar包,并将所有依赖项打包在里面,那么你可能会将其上传到软件包管理库,用户手动下载。在这种情况下,dependency-reduced-pom.xml文件对你来说没有任何作用。
另一个原因是,因为你正在构建一个库并且正在使用其他常见库的特定版本。你不想强制你的用户使用与你相同的版本。通过Shading,你可以有效地给这些依赖项命名空间,然后你的用户可以再次包含相同的库,但是使用不同的版本。
在这种情况下,如果你上传原始的Pom文件,那么依赖于你的库的用户最终会从shaded副本和Pom中声明的副本中重复引入所有依赖项。相反,上传dependency-reduced-pom.xml文件可以防止这种情况发生,因为其中移除了shaded依赖项声明。
dependency-reduced-pom.xml
的目的是展示你正在准备的构件的最终依赖项集。假设构件X
依赖于A
和B
。通过使用maven-shade-plugin嵌入B
依赖,我们创建了一个仅依赖于A
的构件。这就是dependency-reduced-pom.xml
会告诉你的内容(该文件中不会包含B
依赖)。该文件将安装在Maven仓库中,以替换原始的pom.xml
。在计算构件X
的依赖项集时,它将被用于判断,因此如果任何其他模块依赖于X
,它将不会依赖于B
。dependency-reduced-pom.xml
。简单地理解,当在Tomcat中运行应用程序时,您可能不需要提供Servlet jar,其中包含诸如Servlet.class依赖项之类的类。它将由所选的运行时环境提供。