太ったJARを作成してデプロイすると人々が言うのを聞いたことがあります。彼らは実際にはどういう意味ですか?
ファット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>
ファットjarまたはuber jarは、すべてのプロジェクトクラスファイルとリソースとそのすべての依存関係を含むjarです。そのような効果を達成するためのさまざまな方法があります。
サンプルのアセンブリプラグイン設定の下 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>
実行可能jarの場合、ファットjarについて考えるもう1つの方法は、起動することで実行できます。
Java -jar myFatLibrary.jar
-cp
/--classpath
を必要とせず、jarアイコンをダブルクリックする必要もありません。
Skinny–コードエディタに文字通り入力するビットのみを含み、それ以外は何も含みません。
Thin–上記のすべてに加えて、アプリのアプリの直接的な依存関係(dbドライバー、ユーティリティライブラリなど)が含まれます。
Hollow– Thinの逆–アプリの実行に必要なビットのみが含まれますが、アプリ自体は含まれません。基本的に、従来のJava EEアプリサーバーと同じスタイルで、後で重要な違いがあるアプリをデプロイできる、事前にパッケージ化された「アプリサーバー」。
Fat/Uber–文字通り自分で書くビットを含むPLUSアプリの直接依存関係PLUSアプリを「単独で」実行するために必要なビット。
ソース: Dzoneの記事
ファット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);