【问题标题】:What is a shaded jar? And what is the difference/similarities between uber jar and shaded jar? [duplicate]什么是带阴影的罐子? uber jar 和 shaded jar 之间有什么区别/相似之处? [复制]
【发布时间】:2018-09-23 10:25:56
【问题描述】:

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

【问题讨论】:

  • How much research effort is expected of Stack Overflow users? 答案,“很多。一个荒谬的数量。超过你认为你的能力。在你到达你的绳索的尽头和没有的痛苦之后答案超过了发布您的问题所带来的大量耻辱,那时您可以继续提问。因为到那时,您将完成任何必要的研究,使其成为一个值得提出的好问题!”跨度>

标签: java maven maven-shade-plugin


【解决方案1】:

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

优步 JAR

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

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

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

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

您可以创建一个 uber JAR,其中包含来自这些依赖 JAR 的所有类等,然后简单地从这个 uber JAR 运行您的应用程序,而不是随您的应用程序一起提供这些依赖 JAR。

阴影

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

例如:

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

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

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

maven-shade-plugin 允许您 (a) 创建一个 uber JAR 并 (b) 对其内容进行着色。

总结

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

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

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

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 2013-01-10
    • 2015-08-04
    • 1970-01-01
    • 2012-03-17
    • 2014-05-22
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多