什么是阴影罐? uber jar 和 shaded jar 之间的 difference/similarities 是多少?

What is a shaded jar? And what is the difference/similarities between uber jar and shaded jar?

能否请您帮助解释什么是阴影罐以及 maven-shade-plugin 有何用处?还有什么是uber jar。

我将首先解释什么是 uber JAR,因为它支持阴影解释。

优步 JAR

一个 uber JAR 是一个包含多个 JAR 内容的 JAR(或者,不太常见的是,多个其他 JAR 本身)

您的应用程序几乎肯定会使用其他包,并且这些包可能作为 JAR 提供。使用 Maven 时,这些依赖项将表示如下:

<dependency>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
</dependency>

在 运行 时,您的应用程序希望在其类路径中找到此 JAR 中包含的 类。

您可以创建一个超级 JAR,其中包含来自这些依赖 JAR 的所有 类 等,然后只需 运行 您的应用程序,而不是将这些依赖 JAR 与您的应用程序一起运送这个超级 JAR。

阴影

Shading 提供了一种创建超级 JAR 并重命名该超级 JAR 包含的包的方法。如果您的 uber JAR 可能被用作另一个应用程序的依赖项,那么 uber JAR 中依赖项 类 的版本可能会与其他应用程序中那些相同依赖项的版本发生冲突。着色有助于通过重命名超级 JAR 中的包来避免任何此类问题。

例如:

  1. 您创建了一个超级 JAR,其中包含 Foo 库的 v1.0.0。
  2. 其他人在他们的应用程序中使用您的超级 JAR,Bar
  3. Bar 应用程序自身依赖于 Foo,但依赖于该库的 v1.2.0。

现在,如果 Foo 的 1.0.0 版和 1.2.0 版之间存在任何冲突,我们可能会遇到问题,因为 Bar 的所有者无法确定将加载哪个版本,因此要么他们的代码会出现异常,要么您的代码 - 当 运行在他们的应用程序中运行时 - 会出现异常。

阴影有助于避免此类问题,还允许 Foo 的提供者明确说明其使用的依赖库的版本。

maven-shade-plugin 允许您 (a) 创建超级 JAR 和 (b) 隐藏其内容。

总结

创建超级 JAR 是简化部署过程的有用技术。

Shading 是 uber JAR 想法的扩展,它通常仅限于

的用例
  • JAR 是一个可以在另一个 application/library
  • 中使用的库
  • JAR 的作者希望确保 JAR 使用的依赖项在他们的控制之下
  • JAR 的作者希望避免 'version clash' 使用 JAR
  • 的任何 applications/libraries 问题