maven shade插件的用途是什么?为什么要重新定位Java包?

我发现maven shade插件正在某人的pom.xml中使用。我以前从未使用过maven shade插件(我是maven n00b),所以我试图理解使用它的原因以及它的作用

我看了看Maven docs,但我无法理解这句话:

该插件提供了将工件打包到uber jar中的功能,包括其依赖项,并对某些依赖项的包进行着色(即重命名)

页面上的文档似乎对新手不太友好

什么是“一个”呢;优步罐?“;为什么有人想做一个?重命名依赖项的包有什么意义?我试着浏览maven shade插件apache页面上的示例,例如;正在为Uber Jar选择内容,"但我仍然不明白“我的工作是什么”;阴影。”

任何指向说明性示例/用例的指针(解释为什么在这种情况下需要着色-它解决了什么问题)都将不胜感激。最后,我应该什么时候使用maven shade插件

简而言之,Uber JAR是一个包含所有内容的罐子

通常在Maven中,我们依赖依赖依赖关系管理。工件只包含其自身的类/资源。Maven将负责找出项目所依赖的所有工件(JAR等),具体取决于项目的构建时间

uber jar是一种能够获取所有依赖项,提取依赖项内容并将其与项目本身的类/资源放在一个大jar中的东西。有了这样一个uber罐子,执行起来就很容易了,因为运行应用程序只需要一个大罐子,而不需要很多小罐子。在某些情况下,它还简化了分配

请注意:避免将uber jar用作Maven依赖项,因为这会破坏Maven的依赖项解析功能。通常,我们只为实际部署或手动分发的最终工件创建uber jar,而不为放入Maven存储库创建uber jar


最新消息:我刚刚发现我没有回答问题的一部分:“;重命名依赖项的包有什么意义;。下面是一些简短的更新,希望能帮助有类似问题的人

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

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

为了解决这个问题,Foo的开发者可以选择使用shade插件来重命名其对Bar的使用,这样Bar:1.0jar中的所有类都嵌入到Foojar中,嵌入的Bar类的包从com.Bar更改为com.Foo.Bar。通过这样做,Qux可以安全地依赖于Bar:2.0,因为现在Foo不再依赖于Bar,而是使用自己的"“更改”条形图位于另一个包中

发表评论