什么是阴影罐?uber jar和shad jar之间的区别/相似之处是什么?优步 JAR描影法总结

2022-08-31 16:07:38

您能帮助解释一下什么是阴影罐子以及它有什么用吗?还有什么是超级罐子。maven-shade-plugin


答案 1

我将首先解释什么是uber JAR,因为这支持了着色解释。

优步 JAR

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

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

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

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

与其随应用程序一起发布这些依赖的 JAR,不如创建一个 uber JAR,其中包含来自这些依赖 JAR 的所有类等,然后只需从这个 uber JAR 运行您的应用程序。

描影法

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

例如:

  1. 您创建一个包含 v1.0.0 库的 uber JAR。Foo
  2. 其他人在他们的应用程序中使用您的uber JAR,Bar
  3. 应用程序对该库的 v1.2.0 有自己的依赖关系。BarFoo

现在,如果版本1.0.0和1.2.0之间存在任何冲突,我们可能会遇到问题,因为所有者不能依赖将加载哪一个,因此他们的代码将行为异常,或者您的代码 - 当在他们的应用程序中运行时 - 将行为异常。FooBar

着色有助于避免此类问题,并且还允许 的提供者明确说明它使用的依赖库的版本。Foo

允许您(a)创建一个uber JAR和(b)遮蔽其内容。maven-shade-plugin

总结

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

着色是 uber JAR 概念的扩展,通常仅限于以下用例:

  • JAR 是要在另一个应用程序/库中使用的库
  • JAR 的作者希望确保 JAR 使用的依赖项在其控制之下
  • JAR 的作者希望避免使用 JAR 的任何应用程序/库的“版本冲突”问题

答案 2

推荐