编程语言
首页 > 编程语言> > 什么是maven-shade-plugin,为什么要重新定位Java包?

什么是maven-shade-plugin,为什么要重新定位Java包?

作者:互联网

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

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

“This plugin provides the capability to package the artifact in an uber-jar, including its dependencies and to shade – i.e. rename – the packages of some of the dependencies.” The documentation on the page doesn’t seem very newbie-friendly.

什么是“超级罐子?”为什么有人想制作一个?重命名依赖项包的重点是什么?我试图通过maven-shade-plugin apache页面上的示例,例如“为Uber Jar选择内容”,但我仍然无法理解“着色”所取得的成就.

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

解决方法:

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

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

uber-jar是接受所有依赖项的东西,并且在一个大JAR中提取依赖项的内容并将它们与项目本身的类/资源一起放入.通过拥有这样的超级jar,它很容易执行,因为你只需要一个大的JAR而不是大量的小JAR来运行你的应用程序.在某些情况下,它也便于分发.

只是一个侧面说明.避免使用uber-jar作为Maven依赖,因为它破坏了Maven的依赖性解析功能.通常我们只为实际部署或手动分发的最终工件创建uber-jar,但不是为了放入Maven存储库.

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

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

例如,我正在开发Foo库,它依赖于Bar库的特定版本(例如1.0).假设我无法使用其他版本的Bar lib(因为API更改或其他技术问题等).如果我简单地将Bar:1.0声明为Foo在Maven中的依赖关系,则可能会出现问题:Qux项目依赖于Foo,还有Bar:2.0(并且它不能使用Bar:1.0,因为Qux需要使用新功能在酒吧:2.0).这就是困境:如果Qux使用Bar:1.0(Qux的代码不起作用)或Bar:2.0(Foo的代码不起作用)?

为了解决这个问题,Foo的开发人员可以选择使用shade插件来重命名它的Bar的用法,以便Bar:1.0 jar中的所有类都嵌入在Foo jar中,并且嵌入的Bar类的包从com更改.bar到com.foo.bar.通过这样做,Qux可以安全地依赖于Bar:2.0,因为现在Foo不再依赖于Bar,并且它正在使用自己的另一个包中的“已更改”Bar副本.

标签:java,maven,maven-shade-plugin,jar
来源: https://codeday.me/bug/20190916/1806568.html