什么是胖JAR?

erw*_*man 121 java jar uberjar

我听说有人说他们创建了一个胖JAR并进行部署.他们究竟是什么意思?

Dmi*_*urg 88

胖jar是jar,它包含所有库中的类,您的项目依赖于它们,当然还包括当前项目的类.

在不同的构建系统中,fat jar的创建方式不同,例如,在Gradle中,可以使用(指令)创建它:

task fatJar(type: Jar) {
    manifest {
        attributes 'Main-Class': 'com.example.Main'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}
Run Code Online (Sandbox Code Playgroud)

在Maven中,它是以这种方式完成的(在设置常规jar之后):

<pluginRepositories>
   <pluginRepository>
        <id>onejar-maven-plugin.googlecode.com</id>
        <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
   </pluginRepository>
Run Code Online (Sandbox Code Playgroud)

  • 那么"胖罐子"只是"超级罐子"的另一个名字吗? (22认同)
  • @gturri是的,确切地说. (7认同)
  • 为什么在maven程序集插件与它的jar-with-dependencies程序集时使用一些第三方插件? (3认同)
  • @MeTTeO您可以在不使用插件的情况下添加自己的答案. (3认同)
  • 我认为 Uber-jar 是捆绑概念的特定实现,而胖 jar 只是概念本身。 (2认同)

MeT*_*TeO 13

胖jar或超级jar是一个jar,它包含所有项目类文件和资源以及它的所有依赖项.有不同的方法来实现这种效果:

  • 依赖项的jar被复制到主jar中,然后使用特殊的类加载器(onejar)加载
  • 依赖项的jar被提取在主jar层次结构的顶部(maven-assembly-plugin,带有jar-with-dependencies程序集,maven-shade-plugin带有阴影目标)

下面的示例程序集插件配置jar-with-dependencies:

<project>
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <!-- NOTE: We don't need a groupId specification because the group is
             org.apache.maven.plugins ...which is assumed by default.
         -->
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <classifier
        </configuration>
        ...
</project>
Run Code Online (Sandbox Code Playgroud)

  • 使用 FAT jar 需要注意的一件事是:跨不同依赖 jar 的相同类的冲突版本。根据您采用的方法(即完全爆炸所有罐子,然后将它们重新组装成一个罐子,而不是一罐罐子),您可以获得真正不同的(通常是非常令人沮丧的繁荣)效果。两种方法都不一定更好。大多数构建系统都有某种“反向依赖浏览器”,可以提醒您注意此类版本冲突。 (2认同)

Sri*_*bat 10

在可执行jar的情况下,另一种思考胖jar的方法是你可以通过调用来执行:

java -jar myFatLibrary.jar
Run Code Online (Sandbox Code Playgroud)

无需-cp/ --classpath,甚至双击jar图标.

  • 请记住,-jar 需要 MANIFEST.MF 中的主类标头:https://docs.oracle.com/javase/tutorial/deployment/jar/run.html (2认同)

Mar*_*Han 5

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

–仅包含您实际在代码编辑器中键入的位,而没有其他内容。

–包含以上所有内容以及应用对应用的直接依赖关系(数据库驱动程序,实用程序库等)。

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

脂肪/尤伯杯 -包含位您字面上写自己PLUS您的应用程序的直接依赖PLUS为“自身”运行你的应用程序所需的位。

资料来源:Dzone的文章

可视化的JAR类型

  • IMO的最佳答案,因为它还可以与其他罐子类型进行比较。 (2认同)