我将首先解释 uber JAR 是什么,因为这是阴影解释的基础。
优步 JAR
一个超级 JAR 是一个包含多个 JAR 内容的 JAR(或者,不太常见的是,多个其他 JAR 本身)
您的应用程序几乎肯定会使用其他包,并且这些包可能以 JAR 的形式提供。使用 Maven 时,这些依赖关系将表示如下:
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
</dependency>
在运行时,您的应用程序将期望在其类路径中找到此 JAR 中包含的类。
您可以创建一个 uber JAR,其中包含来自这些依赖 JAR 的所有类等,然后简单地从这个 uber JAR 运行您的应用程序,而不是随您的应用程序一起提供这些依赖 JAR。
阴影
Shading 提供了一种创建 uber JAR 和重命名 uber JAR 包含的包的方法。如果您的 uber JAR 可能被用作另一个应用程序中的依赖项,那么 uber JAR 中的依赖类的版本可能会与其他应用程序中相同依赖项的版本发生冲突。通过重命名 uber JAR 中的包,阴影有助于避免任何此类问题。
例如:
- 您创建了一个 uber JAR,其中包含
Foo 库的 v1.0.0。
- 其他人在他们的应用程序中使用您的 uber JAR,
Bar
-
Bar 应用程序对 Foo 有自己的依赖关系,但依赖于该库的 v1.2.0。
现在,如果 Foo 的 1.0.0 和 1.2.0 版本之间存在任何冲突,我们可能会遇到问题,因为 Bar 的所有者无法依赖将加载哪个版本,因此他们的代码要么行为不端,要么您的代码 - 在他们的应用程序中运行时 - 会出现异常。
阴影有助于避免此类问题,还允许Foo 的提供者明确其使用的依赖库的版本。
maven-shade-plugin 允许您 (a) 创建一个 uber JAR 并 (b) 对其内容进行着色。
总结
创建 uber JAR 是一种用于简化部署过程的有用技术。
着色是对 uber JAR 理念的扩展,通常仅限于以下用例:
- JAR 是要在另一个应用程序/库中使用的库
- JAR 的作者希望确保 JAR 使用的依赖项在他们的控制之下
- JAR 的作者希望避免使用 JAR 的任何应用程序/库出现“版本冲突”问题