一尘不染

maven-shade-plugin的用途是什么?为什么要重定位Java包?

java

我发现有人的pom.xml中使用了maven-shade-plugin。我以前从未使用过maven-shade-plugin(并且我是Maven n00b),所以我试图了解使用它的原因及其作用。

我看了看Maven文档,但是我听不懂这句话:

“此插件提供了将工件打包在uber-jar中的功能,包括其依赖项,并可以遮蔽(即重命名)某些依赖项的包。”

该页面上的文档似乎不太适合新手。

什么是“超级jar”?为什么有人要做一个?重命名依赖包的意义何在?我尝试浏览了Maven-shade-plugin apache页面上的示例,例如“为Uber Jar选择内容”,但是我仍然不明白使用“ shading”可以完成什么。

任何指向说明性示例/用例的指示(带有在这种情况下为什么需要阴影的解释-它要解决什么问题)将不胜感激。最后,什么时候应该使用Maven-shade-plugin?


阅读 548

收藏
2020-03-18

共1个答案

一尘不染

简而言之,Uber JAR是包含所有内容的JAR。

通常在Maven中,我们依赖于依赖项管理。工件仅包含其自身的类/资源。Maven将负责根据项目的构建时间来找出项目的所有工件(JAR等)。

uber-jar是一个包含所有依赖项的东西,并提取依赖项的内容并将其与项目本身的类/资源放在一个大的JAR中。通过拥有这样的uber-jar,它很容易执行,因为你只需要一个大JAR即可运行大量应用,而无需大量的小JAR。在某些情况下,这也简化了分配。

只是一个旁注。避免将uber-jar用作Maven依赖项,因为它破坏了Maven的依赖项解析功能。通常,我们仅为最终工件创建uber-jar以便进行实际部署或手动分发,而不是将其放入Maven存储库。

更新:我刚刚发现我还没有回答问题的一部分:“重命名依赖包有什么意义?”。这是一些简短的更新,希望对有类似问题的人有所帮助。

创建uber-jar以便于部署是shade插件的一个用例。还有其他一些常见的用例,涉及包重命名。

例如,我正在开发Foo库,这取决于库的特定版本(例如1.0)Bar。假设我无法使用其他版本的Barlib(因为API更改或其他技术问题等)。如果我只是在Maven中声明Bar:1.0Foo的依赖项,则可能会遇到一个问题:一个Qux项目依赖于Foo,并且也依赖Bar:2.0(并且它不能使用,Bar:1.0因为Qux需要使用中的新功能Bar:2.0)。这是一个难题:应该Qux使用Bar:1.0(哪个Qux代码不起作用)还是Bar:2.0(哪个Foo代码不起作用)?

为了解决此问题,of的开发人员Foo可以选择使用shade插件重命名其用法Bar,以便将Bar:1.0jar中的所有类都嵌入Foojar中,并将嵌入Bar类的包从更改com.barcom.foo.bar。这样,Qux可以放心地依赖,Bar:2.0因为现在Foo不再依赖Bar,它使用的是Bar位于另一个包中的“更改”的自己的副本。

2020-03-18