web-dev-qa-db-ja.com

ファットJARとは何ですか?

太ったJARを作成してデプロイすると人々が言うのを聞いたことがあります。彼らは実際にはどういう意味ですか?

110
erwaman

ファットjarとは、プロジェクトが依存するすべてのライブラリのクラスと、もちろん現在のプロジェクトのクラスを含むjarです。

異なるビルドシステムでは、ファット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>
85
Dmitry Ginzburg

ファットjarまたはuber jarは、すべてのプロジェクトクラスファイルとリソースとそのすべての依存関係を含むjarです。そのような効果を達成するためのさまざまな方法があります。

  • 依存関係のjarはメインjarにコピーされ、特別なクラスローダー(onejar)を使用してロードされます
  • 依存関係のjarはメインのjar階層の最上部で抽出されます(jar-with-dependenciesアセンブリを含むmaven-Assembly-plugin、シェードゴールを含む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>
12
MeTTeO

実行可能jarの場合、ファットjarについて考えるもう1つの方法は、起動することで実行できます。

Java -jar myFatLibrary.jar

-cp/--classpathを必要とせず、jarアイコンをダブルクリックする必要もありません。

9

異なる名前は、Javaアプリをパッケージ化する方法にすぎません。

Skinny–コードエディタに文字通り入力するビットのみを含み、それ以外は何も含みません。

Thin–上記のすべてに加えて、アプリのアプリの直接的な依存関係(dbドライバー、ユーティリティライブラリなど)が含まれます。

Hollow– Thinの逆–アプリの実行に必要なビットのみが含まれますが、アプリ自体は含まれません。基本的に、従来のJava EEアプリサーバーと同じスタイルで、後で重要な違いがあるアプリをデプロイできる、事前にパッケージ化された「アプリサーバー」。

Fat/Uber–文字通り自分で書くビットを含むPLUSアプリの直接依存関係PLUSアプリを「単独で」実行するために必要なビット。

ソース: Dzoneの記事

Visual representation of JAR types

1
Mark Han

ファット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);
0
Jerome Angibaud