什么是阴影罐? uber jar和shaded jar之间有什么区别/相似之处?

时间:2018-04-13 06:27:52

标签: java maven maven-shade-plugin

你能帮忙解释什么是阴影罐子,maven-shade-plugin有用吗?什么是超级罐。

1 个答案:

答案 0 :(得分:20)

我将首先解释一下超级JAR是什么,因为这是阴影解释的基础。

Uber JAR

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

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

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

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

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

<强>底纹

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

例如:

  1. 您创建一个包含Foo库的v1.0.0的超级JAR。
  2. 其他人在其应用中使用您的超级JAR Bar
  3. Bar应用程序对Foo有自己的依赖关系,但在该库的v1.2.0上。
  4. 现在,如果Foo的版本1.0.0和1.2.0之间存在任何冲突,我们可能会遇到问题,因为Bar的所有者无法依赖将加载哪一个,因此代码将行为不当或您的代码 - 在他们的应用程序中运行时 - 将会出错。

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

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

    <强>摘要

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

    着色是超级JAR理念的扩展,通常仅限于使用

    的用例
    • JAR是一个在另一个应用程序/库中使用的库
    • JAR的作者希望确保JAR使用的依赖关系在其控制之中
    • JAR的作者希望避免版本冲突&#39;使用JAR的任何应用程序/库的问题