ファット JAR を作成してデプロイするという話を聞いたことがあります。それらは実際にはどういう意味ですか?
6 に答える
さまざまな名前は、Java アプリをパッケージ化する方法にすぎません。
Skinny – コード エディターに文字通り入力したビットのみが含まれ、それ以外は含まれません。
Thin – 上記のすべてに加えて、アプリのアプリの直接的な依存関係 (db ドライバー、ユーティリティ ライブラリなど) が含まれます。
Hollow – Thin の逆 – アプリの実行に必要なビットのみが含まれますが、アプリ自体は含まれません。基本的には、パッケージ化された「アプリ サーバー」であり、後でアプリをデプロイできます。従来の Java EE アプリ サーバーと同じスタイルですが、重要な違いがあります。
Fat/Uber –文字通り自分で書いたビットに加えて、アプリの直接的な依存関係に加えて、アプリを「単独で」実行するために必要なビットが含まれています。
出典:Dzoneの記事
Fat jar または uber jar は、すべてのプロジェクト クラス ファイルとリソースがすべての依存関係と共にパックされた jar です。このような効果を得るには、さまざまな方法があります。
- 依存関係の jar はメインの jar にコピーされ、特別なクラス ローダー (onejar、spring-boot-plugin:repackage) を使用してロードされます。
- 依存関係の jar は、メインの jar 階層の最上位に抽出されます (jar-with-dependencies アセンブリを含む maven-assembly-plugin)
- 依存関係の jar はメインの jar 階層の最上位で展開され、それらのパッケージの名前が変更されます (shade ゴールを持つ 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>
より詳細な説明については、imagej.net の Uber-JAR を参照してください。
ファット 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);
Java 空間では、アプリケーションとその依存関係は、通常、単一の配布アーカイブ内の個別の JAR としてパッケージ化されていました。それはまだ起こりますが、現在一般的な別のアプローチがあります。依存関係のクラスとリソースをアプリケーション JAR に直接配置し、uber または fat 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
各 JAR ファイルをzipTree()
メソッドでラップします。その結果、ZIP ファイル ツリーのコレクションが作成され、その内容がアプリケーション クラスと一緒に uber JAR にコピーされます。