我发现有人在 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.
页面上的文档似乎对新手不太友好。
什么是“ super jar ”?为什么有人想做一个?重命名依赖项的包有什么意义?我试图浏览 maven-shade-plugin apache 页面上的示例,例如“为 Uber Jar 选择内容”,但我仍然无法理解“着色”正在完成什么。
任何指向说明性示例/用例的指针(解释为什么在这种情况下需要阴影 - 它解决了什么问题)将不胜感激。最后,什么时候应该使用 maven-shade-plugin?
Uber JAR,简而言之,就是一个包含一切的 JAR。
通常在 Maven 中,我们依赖依赖管理。 Artifact 仅包含其自身的类/资源。 Maven 将负责找出项目所依赖的所有 Artifact (JAR 等)。
一个 uber-jar 是一种获取所有依赖项的东西,并提取依赖项的内容并将它们与项目本身的类/资源一起放在一个大 JAR 中。通过拥有这样一个 uber-jar,执行起来很容易,因为您只需要一个大 JAR 而不是大量的小 JAR 来运行您的应用程序。在某些情况下,它还可以简化分发。
附带说明:避免使用 uber-jar 作为 Maven 依赖项,因为它会破坏 Maven 的依赖项解析功能。通常我们只为最终 Artifact 创建一个 uber-jar 用于实际部署或手动分发,而不是用于放入 Maven 存储库。
更新:我刚刚发现我还没有回答问题的一部分:“重命名依赖项的包有什么意义?”。以下是一些简短的更新,希望能对有类似问题的人有所帮助。
创建一个易于部署的 uber-jar 是 shade 插件的一个用例。还有其他涉及包重命名的常见用例。
例如,我正在开发 Foo
库,它依赖于 Bar
库的特定版本(例如 1.0)。假设我无法使用其他版本的 Bar
lib(因为 API 更改或其他技术问题等)。如果我在 Maven 中简单地将 Bar:1.0
声明为 Foo
的依赖项,则可能会遇到问题: Qux
项目依赖在 Foo
上,还有 Bar:2.0
(它不能使用 Bar:1.0
因为 Qux
需要使用 new Bar: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
的自己的副本。
我是一名优秀的程序员,十分优秀!