什么是胖JAR?

时间:2013-10-03 04:31:12

标签: java jar uberjar

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

5 个答案:

答案 0 :(得分:76)

fat jar是jar,它包含所有库的类,你的项目所依赖的类,当然还包括当前项目的类。

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

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
}

在Maven中,这样做(在设置常规jar之后):

<pluginrepositories>
    <pluginrepository>
        <id>onejar-maven-plugin.googlecode.com</id>
        <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
    </pluginrepository>
</pluginrepositories>

<!-- ... -->

<plugin>
    <groupid>org.dstovall</groupid>
    <artifactid>onejar-maven-plugin</artifactid>
    <version>1.4.4</version>
    <executions>
        <execution>
            <configuration>
                <onejarversion>0.97</onejarversion>
                <classifier>onejar</classifier>
            </configuration>
            <goals>
                <goal>one-jar</goal>
            </goals>
        </execution>
   </executions>
</plugin>

答案 1 :(得分:8)

对于可执行jar,另一种考虑胖jar的方法是你可以通过调用来执行:

java -jar myFatLibrary.jar

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

答案 2 :(得分:6)

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

Skinny (瘦) –仅包含您在代码编辑器中实际键入的位,并且不包含其他任何内容。

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

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

Fat / Uber –包含您从字面上为自己编写的内容 PLUS 与应用程序直接依赖的内容 PLUS 运行应用程序所需的位“在其自己的”。

来源:Article from Dzone

Visual representation of JAR types

答案 3 :(得分:0)

胖jar包含与经典jar相同的类+所有运行时依赖项中的类。

使用Jeka(https://jeka.dev),您可以通过编程实现它:

JkPathTreeSet.of(Paths.get("classes")).andZips(
    Paths.get("bouncycastle-pgp-152.jar"),
    Paths.get("classgraph-4.8.41.jar"),
    Paths.get("ivy-2.4.0.jar")
).zipTo(Paths.get("fat.jar"));

或仅通过参数化Java插件即可:

javaPlugin.getProject().getMaker().defineMainArtifactAsFatJar(true);

答案 4 :(得分:0)

来自Gradle documentation

在Java空间中,应用程序及其依赖项通常用于打包为单个分发归档文件中的独立JAR。仍然发生这种情况,但是现在有另一种常见的方法:将依赖项的类和资源直接放入应用程序JAR中,创建所谓的超级或胖JAR。

这是uberJar文件中的build.gradle任务的证明:

task uberJar(type: Jar) {
    archiveClassifier = 'uber'

    from sourceSets.main.output

    dependsOn configurations.runtimeClasspath
    from {
        configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) }
    }
}

在这种情况下,我们将获取项目的运行时依赖项configurations.runtimeClasspath.files,并使用zipTree()方法包装每个JAR文件。结果是一个ZIP文件树的集合,这些树文件的内容与应用程序类一起复制到uber JAR中。