什么是阴影罐? uber jar 和 shaded jar 之间的 difference/similarities 是多少?
What is a shaded jar? And what is the difference/similarities between uber jar and shaded jar?
能否请您帮助解释什么是阴影罐以及 maven-shade-plugin
有何用处?还有什么是uber jar。
我将首先解释什么是 uber JAR,因为它支持阴影解释。
优步 JAR
一个 uber JAR 是一个包含多个 JAR 内容的 JAR(或者,不太常见的是,多个其他 JAR 本身)
您的应用程序几乎肯定会使用其他包,并且这些包可能作为 JAR 提供。使用 Maven 时,这些依赖项将表示如下:
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
</dependency>
在 运行 时,您的应用程序希望在其类路径中找到此 JAR 中包含的 类。
您可以创建一个超级 JAR,其中包含来自这些依赖 JAR 的所有 类 等,然后只需 运行 您的应用程序,而不是将这些依赖 JAR 与您的应用程序一起运送这个超级 JAR。
阴影
Shading 提供了一种创建超级 JAR 并重命名该超级 JAR 包含的包的方法。如果您的 uber JAR 可能被用作另一个应用程序的依赖项,那么 uber JAR 中依赖项 类 的版本可能会与其他应用程序中那些相同依赖项的版本发生冲突。着色有助于通过重命名超级 JAR 中的包来避免任何此类问题。
例如:
- 您创建了一个超级 JAR,其中包含
Foo
库的 v1.0.0。
- 其他人在他们的应用程序中使用您的超级 JAR,
Bar
Bar
应用程序自身依赖于 Foo
,但依赖于该库的 v1.2.0。
现在,如果 Foo
的 1.0.0 版和 1.2.0 版之间存在任何冲突,我们可能会遇到问题,因为 Bar
的所有者无法确定将加载哪个版本,因此要么他们的代码会出现异常,要么您的代码 - 当 运行在他们的应用程序中运行时 - 会出现异常。
阴影有助于避免此类问题,还允许 Foo
的提供者明确说明其使用的依赖库的版本。
maven-shade-plugin
允许您 (a) 创建超级 JAR 和 (b) 隐藏其内容。
总结
创建超级 JAR 是简化部署过程的有用技术。
Shading 是 uber JAR 想法的扩展,它通常仅限于
的用例
- JAR 是一个可以在另一个 application/library
中使用的库
- JAR 的作者希望确保 JAR 使用的依赖项在他们的控制之下
- JAR 的作者希望避免 'version clash' 使用 JAR
的任何 applications/libraries 问题
能否请您帮助解释什么是阴影罐以及 maven-shade-plugin
有何用处?还有什么是uber jar。
我将首先解释什么是 uber JAR,因为它支持阴影解释。
优步 JAR
一个 uber JAR 是一个包含多个 JAR 内容的 JAR(或者,不太常见的是,多个其他 JAR 本身)
您的应用程序几乎肯定会使用其他包,并且这些包可能作为 JAR 提供。使用 Maven 时,这些依赖项将表示如下:
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
</dependency>
在 运行 时,您的应用程序希望在其类路径中找到此 JAR 中包含的 类。
您可以创建一个超级 JAR,其中包含来自这些依赖 JAR 的所有 类 等,然后只需 运行 您的应用程序,而不是将这些依赖 JAR 与您的应用程序一起运送这个超级 JAR。
阴影
Shading 提供了一种创建超级 JAR 并重命名该超级 JAR 包含的包的方法。如果您的 uber JAR 可能被用作另一个应用程序的依赖项,那么 uber JAR 中依赖项 类 的版本可能会与其他应用程序中那些相同依赖项的版本发生冲突。着色有助于通过重命名超级 JAR 中的包来避免任何此类问题。
例如:
- 您创建了一个超级 JAR,其中包含
Foo
库的 v1.0.0。 - 其他人在他们的应用程序中使用您的超级 JAR,
Bar
Bar
应用程序自身依赖于Foo
,但依赖于该库的 v1.2.0。
现在,如果 Foo
的 1.0.0 版和 1.2.0 版之间存在任何冲突,我们可能会遇到问题,因为 Bar
的所有者无法确定将加载哪个版本,因此要么他们的代码会出现异常,要么您的代码 - 当 运行在他们的应用程序中运行时 - 会出现异常。
阴影有助于避免此类问题,还允许 Foo
的提供者明确说明其使用的依赖库的版本。
maven-shade-plugin
允许您 (a) 创建超级 JAR 和 (b) 隐藏其内容。
总结
创建超级 JAR 是简化部署过程的有用技术。
Shading 是 uber JAR 想法的扩展,它通常仅限于
的用例- JAR 是一个可以在另一个 application/library 中使用的库
- JAR 的作者希望确保 JAR 使用的依赖项在他们的控制之下
- JAR 的作者希望避免 'version clash' 使用 JAR 的任何 applications/libraries 问题