什么是超级罐子?

Posted

技术标签:

【中文标题】什么是超级罐子?【英文标题】:What is an uber jar? 【发布时间】:2012-08-10 10:24:57 【问题描述】:

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

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

【问题讨论】:

我也偶尔看到它被称为“onejar”或“one-jar”。 【参考方案1】:

Überaboveover 的德语单词(它实际上与英语 over 同源)。

因此,在这种情况下,一个 uber-jar 是一个“over-jar”,比一个简单的 JAR (a) 高一级,定义为一个包含你的包 并且 它的所有依赖项都在一个 JAR 文件中。这个名字可以认为和ultrageek、superman、hyperspace、metadata都来自同一个stable,都具有“超凡脱俗”的相似含义。

优点是您可以分发您的 uber-jar,而根本不关心目标是否安装了依赖项,因为您的 uber-jar 实际上没有没有依赖项。

你自己的东西在 uber-jar 中的所有依赖项在那个 uber-jar 中。这些依赖项的所有依赖项也是如此。以此类推。


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

【讨论】:

奇怪...我是德国人,当然知道“über”这个词及其含义。但是为什么在 Maven 上下文中使用它呢?这种情况意味着一个或多个东西被收集在一起,并且可以通过生成的 jar 访问。不幸的是,这个提示并没有解决我的 Maven 问题;-) 顺便说一句,überover 是古日耳曼语系统性语音转换的结果,也可以在这些词对中观察到:geben/giveleben/livehaben/haveheben/heave 等等。 非常聪明的描述:示例link 考虑到我对尝试教育人感到多么悲痛,我决定删除一些人一直抱怨的东西。我仍然在德语的上下文中定义 uber,但是(有些冗长的)历史课现在已经消失了 :-) 我:读“历史课”。我:打开修订历史来阅读它。 :-)【参考方案2】:

ubar jar 也称为 fat jar,即 具有依赖关系的 jar。 构建uber jar的常用方法有3种:

    无阴影:解压缩所有 JAR 文件,然后将它们重新打包到一个 JAR 中。 使用 Java 的默认类加载器。工具maven-assembly-plugin Shaded: 与 unshaded 相同,但重命名(即“shade”)所有依赖项的所有 。使用 Java 的默认类加载器。避免一些(不是全部)依赖版本冲突。工具maven-shade-plugin JAR of JAR:最终的 JAR 文件包含嵌入其中的其他 JAR 文件。避免依赖版本冲突。所有资源文件都被保留。工具:Eclipse JAR File Exporter

for more

【讨论】:

【参考方案3】:

Paxdiablo 的定义真的很好。

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

你可以这样做:

基本上是maven-assembly-plugin 更进一步maven-shade-plugin

更简洁的解决方案是单独提供它们的库; maven-shade-plugin 为此预先配置了描述符。这并不复杂(使用 maven 及其插件)。

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

如需进一步配置,请阅读这些主题:

Should you provide dependent libraries in client jar? Best practices in building and deploying Clojure applications: good tutorials?

【讨论】:

【参考方案4】:

不同的名字只是java应用的打包方式。

Skinny – 仅包含您在代码编辑器中真正输入的位,没有其他内容。

Thin – 包含上述所有内容以及应用程序对您的应用程序的直接依赖项(数据库驱动程序、实用程序库等)。

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

Fat/Uber – 包含您自己编写的代码PLUS 应用程序的直接依赖项PLUS 运行您的应用程序所需的代码位“在其自己的”。

来源:Article from Dzone

转自:https://***.com/a/57592130/9470346

【讨论】:

【参考方案5】:

一个独立的、可执行的 Java 档案。在 WildFly Swarm uberjars 的情况下,它是一个包含您的应用程序的单个 .jar 文件、支持它所需的 WildFly 部分、一个内部 Maven 依赖项存储库,以及一个用于引导它的 shim。 see this

【讨论】:

【参考方案6】:

根据 uber-JAR 文档方法: 构建 uber-JAR 的常用方法有以下三种:

无阴影解压所有 JAR 文件,然后将它们重新打包到一个 JAR 中。 工具:Maven Assembly Plugin、Classworlds Uberjar

Shaded 与 unshaded 相同,但重命名(即“shade”)所有依赖项的所有包。 工具:Maven Shade 插件

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

【讨论】:

【参考方案7】:

对于使用 SpringBoot 的 Java 开发人员,ÜBER/FAT JAR通常是 maven 的 package phase 的最终结果(如果您使用 @987654323,则为 build task @)。

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

【讨论】:

以上是关于什么是超级罐子?的主要内容,如果未能解决你的问题,请参考以下文章

微导流超级签名系统搭建有什么优势?

超级签名一个多少钱?超级签名为何要100台起购?

超级签名一个多少钱?超级签名为何要100台起购?

ext系统的超级块

什么是超级视网膜显示器?

电脑的超级用户怎么创建