333

我正在阅读 Maven 文档并遇到了这个名字uber-jar

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

4

7 回答 7

453

Überabove或的德语单词over(它实际上与英语同源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 类文件以及相关的元数据和资源。

于 2012-08-14T06:46:15.403 回答
93

ubar jar也称为fat jar具有依赖项的 jar。
构建 uber jar 的常用方法有以下三种:

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

更多

于 2016-08-19T03:27:14.223 回答
63

Paxdiablo 的定义非常好。

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

你可以这样做:

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

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

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

于 2012-08-14T14:12:15.867 回答
9

不同的名称只是打包 Java 应用程序的方式。

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

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

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

Fat/Uber 包含你自己写的部分加上你的应用程序的直接依赖项加上“独立”运行你的应用程序所需的部分。

资料来源:Dzone 文章

JAR 类型的可视化表示

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

于 2020-05-18T17:11:03.797 回答
4

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

于 2017-05-03T12:46:31.327 回答
0

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

Unshaded解压所有 JAR 文件,然后将它们重新打包成一个 JAR。工具:Maven 组装插件、Classworlds Uberjar

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

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

于 2020-06-28T10:21:33.887 回答
0

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

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

于 2020-08-22T18:49:05.923 回答