什么是超级罐子?

我正在阅读Maven文档,偶然发现了uber-jar这个名字。

uber-jar是什么意思,它的特征/优势是什么?

131185 次浏览

Über是德语单词aboveover(它实际上与英语over同源)。

因此,在这种情况下,super - JAR是一个“over-jar”,比简单的JAR (一)高一级,定义为一个在一个JAR文件中包含包而且及其所有依赖项的JAR。这个名字可以被认为与ultrageek、superman、hyperspace和metadata来自同一个群体,它们都有类似的“超出正常”的含义。

这样做的好处是你可以分发你的super -jar,而完全不关心是否在目的地安装了依赖项,因为你的super -jar实际上没有依赖项。

在这个super -jar中,你自己的东西的所有依赖项都是。这些依赖关系的所有依赖关系也是如此。等等。


我可能不得不向Java开发人员解释什么是JAR,但为了完整起见,我将包括它。它是一个Java存档,基本上是一个单独的文件,通常包含许多Java类文件以及相关的元数据和资源。

Paxdiablo的定义非常好。

另外,如果你真的想发布一个软件,并且不希望客户自己下载依赖项,请考虑交付一个super -jar有时是非常有用的。作为一个缺点,如果他们自己的策略不允许使用某些库,或者如果他们必须绑定一些额外的组件(slf4j,系统兼容库,arch specialiez库,…),这可能会增加他们的困难。

你可以这样做:

一个更清洁的解决方案是分别提供他们的库;Maven-shade-plugin已经为此预配置了描述符。这并不复杂(使用maven及其插件)。

最后,一个非常好的解决方案是使用OSGI Bundle。有很多关于这方面的好教程:)

有关进一步的配置,请阅读这些主题:

ubar jar也称为脂肪jar,即使用依赖项进行Jar。
有三种常见的方法来构建一个超级罐子:

  1. 无遮蔽的:解包所有JAR文件,然后将它们重新打包到一个JAR中。 使用Java的默认类装入器。李工具maven-assembly-plugin < / >
  2. 阴影:与unshade相同,但重命名(即“shade”)所有依赖项的所有。使用Java的默认类装入器。避免部分(不是全部)依赖版本冲突。工具maven-shade-plugin
  3. 罐子中的罐子:最终的JAR文件包含嵌入其中的其他JAR文件。避免依赖版本冲突。保存所有资源文件。工具:Eclipse JAR文件导出器

for more

一个自包含的、可执行的Java存档。在WildFly Swarm uberjars的情况下,它是一个单独的.jar文件,包含您的应用程序,WildFly支持它所需的部分,一个内部Maven依赖库,加上一个引导它的shim。看到这个

不同的名称只是包装java应用程序的方式。

-只包含你字面上输入到你的代码编辑器的位,没有其他的。

-包含以上所有内容,加上应用程序对应用程序的直接依赖(db驱动程序,实用程序库等)。

空心 - Thin的逆-只包含运行应用程序所需的位,但不包含应用程序本身。基本上是一个预先打包的“应用程序服务器”,您可以稍后将应用程序部署到其上,其风格与传统Java EE应用程序服务器相同,但有重要区别。

脂肪/超级 -包含你自己写的位+你的应用程序的直接依赖项+运行你的应用程序“自己”所需的位。

来源:文章来自Dzone

 JAR类型的可视化表示

转载自:https://stackoverflow.com/a/57592130/9470346

根据super - jar文档方法: 有三种构造super - jar的常用方法:

无遮蔽的解包所有JAR文件,然后将它们重新打包到一个JAR中。 工具:Maven组装插件,Classworlds Uberjar

与unshade相同,但重命名(即,“&;shade&;”)所有依赖项的所有包。 工具:Maven Shade Plugin

罐子中的罐子最终的JAR文件包含嵌入其中的其他JAR文件。 工具:Eclipse JAR文件导出器,One-JAR.

对于使用SpringBoot的Java开发人员,超级/脂肪JAR正常情况下——maven的package phase的最终结果(如果使用gradle则为build task)。

在Fat JAR中,你可以找到一个META-INF目录,里面有MANIFEST.MF文件,里面有关于Main类的所有信息。更重要的是,在同一级别的META-INF目录中,你会发现BOOT-INF目录,其中包含目录lib,并包含所有作为应用程序依赖项的.jar文件。