我将首先解释什么是超级JAR,因为这将支持阴影说明。
优步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包含的包的方法。如果您的超级JAR可能被用作另一个应用程序中的依赖项,则存在超级JAR中的依赖类版本可能与另一个应用程序中的相同依赖项版本冲突的风险。通过在uber
JAR中重命名软件包,阴影有助于避免任何此类问题。
例如:
- 您创建一个包含该
Foo
库v1.0.0的超级JAR 。 - 其他人在其应用程序中使用您的超级JAR,
Bar
- 该
Bar
应用程序仅依赖于Foo
该库的v1.2.0,但依赖于该库。
现在,如果
Foo我们的1.0.0版和1.2.0版之间存在冲突,则可能会出现问题,因为的所有者
Bar不能依赖于将加载哪个版本,因此它们的代码将无法正常运行,或者您的代码-
在其应用程序中运行时-会表现不良。
阴影有助于避免诸如此类的问题,并且还允许提供者
Foo明确说明其使用的依赖库的版本。
将
maven-shade-plugin让你(一)创建一个超级JAR和(b)遮阳其内容。
摘要
创建uber JAR是简化部署过程的有用技术。
阴影是对超级JAR概念的扩展,通常只限于以下情况下的用例:
- JAR是要在另一个应用程序/库中使用的库
- JAR的作者希望确保JAR使用的依赖项在他们的控制之下
- JAR的作者希望避免任何使用JAR的应用程序/库的“版本冲突”问题



