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

use*_*709 14 java maven maven-shade-plugin

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

gly*_*ing 33

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

优步JAR

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

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

<dependency>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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

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

底纹

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

例如:

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

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

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

maven-shade-plugin让你(一)创建一个超级JAR和(b)遮阳其内容.

摘要


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

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

  • JAR是一个在另一个应用程序/库中使用的库
  • JAR的作者希望确保JAR使用的依赖关系在他们的控制之下
  • JAR的作者希望避免使用JAR的任何应用程序/库的"版本冲突"问题