Java アプリケーションを単一の実行可能 JAR ファイルとして配布する際、外部依存ライブラリを内部に統合した「Fat JAR」(または「Uber JAR」)が広く用いられます。Eclipse 4.4(Luna)以降に対応する Fat Jar プラグインは、プロジェクトのクラス、リソース、依存 jar を一括で含む JAR を生成することで、デプロイおよび共有のオーバーヘッドを削減します。本稿では、このプラグインの導入〜設定〜実行〜トラブルシューティングまでを実用的な観点から解説します。
- 可実行 JAR の技術的要件
通常の JAR ファイルはエントリーポイント(main メソッド)を明示しないと実行できません。可実行 JAR では、MANIFEST.MF 内の Main-Class 属性に完全修飾クラス名が記述される必要があります。FatJar プラグインはこのマニフェスト設定と依存関係の統合処理を自動化します。
また、Java アプリケーションが独立して動作できるようにするには:
- 全依存ライブラリが JAR 内に展開 or クラスパスに含められていること
- OS 非依存なパス指定(
File.separator使用不可な静的リソース含む) - ランタイム環境のバージョンと整合性のある API 使用 が要件となります。特に微小なコンテナやクラウド環境ではこれらの制約が顕在化します。
- プラグイン導入手順
2.1 Eclipse バージョン確認
Help > About Eclipse SDK で表示されるバージョン情報(例:4.4.2.v20150204-1700)を確認し、該当する FatJar プラグインバージョン を ~/http://(project URL)/releases/ から選択してください。旧バージョン(Kepler 以前)では切り離された拡張ポイントにより不具合が出やすい点に注意が必要です。
2.2 プラグインインストール
オプション A:Eclipse Marketplace を利用
Help > Eclipse Marketplace... → 「fat jar」と検索 → 対象插件を選択 → Install → 実行環境再起動
オプション B:手動インストール(オフライン環境向け)
- 対象バージョンの zip をダウンロード
- ファイルを解凍し、
features/およびplugins/を Eclipse インストールディレクトリにコピー -cleanオプション付きで Eclipse を再起動(例:eclipse.exe -clean)- プラグインが読み込まれていることを
Help > Installation Detailsで確認
※ 注意:Eclipse 4.4 では native 依存の一部 Build ツール(例:Native2Ascii)と競合する可能性があるため、必要なら eclipse.ini に -vm オプションで明示的な JRE/JDK パスを指定してください。
- Fat Jar の生成設定
3.1 パッケージング・オプション
プロジェクトを右クリック → Export... > Fat Jar > Fat Jar Exporter で設定ダイアログを起動。
エントリポイント設定
Main class: フィールドに com.sample.MainApp のように完全修飾名を入力。Browse... で候補から選択できますが、パッケージの非同期リロードにより表示しない場合があるため、手動入力推奨。
リソース除外設定
Includes / Excludes タブより、exclude ルールを追加:
**/*.java(ソースコード)**/*Test*(テストコード)**/.settings/**,**/.classpath,**/.project(IDEメタデータ)META-INF/maven/**(依存 POM 情報) → マニフェストや構成情報のみ必要なら残す
依存関係のマージ方式選択 「Extract dependency」を有効にすると依存 jar を展開済みクラスとして統合し、衝突リスクを下げる一方で JAR 容量が増加します。「Copy dependency」はアーカイブのまま保持するため軽量ですが、多重バージョンの META-INF/services などが干渉する可能性があります。
3.2 詳細マニフェスト制御
Manifest タブでは以下のカスタマイズが可能です:
Main-ClassClass-Path(外部依存 jar を明示したい場合)Implementation-Version(Git commit ID や日付自動付与ASCII文字コード準拠)Tool:FatJar-Exporter/1.2.3などツール識別子
マニフェストは UTF-8 でかつ改行コード LF 固定とし、1 行の長さを 72 文字以内に保つよう注意(RFC 2045 准拠)。プラグインは自動で折り返すため手動調整不要ですが、外部で編集する場合INTLCharsetベースの文字化けに留意が必要です。
- ビルドと検証
4.1 ビルド前のチェックリスト
Project > Clean実行- 動作確認済みテストケースの実行 (
JUnit統合テスト完了) - Maven/Gradle 経由での
dependency:tree(依存解析)でも競合がないか再確認 Problemsビューで compile error / warning 解消
4.2 実行テスト
生成された JAR をコマンド起動:
java -jar dist/app-fat.jar
# または、環境持ち替える場合は
java -Dfile.encoding=UTF-8 -Xmx512m -jar dist/app-fat.jar
JAR 構造確認には:
jar --list --file=dist/app-fat.jar | grep "org.apache.commons.*.class"
※ Java 9+ でのみ --list オプションが利用可能。それ以前のバージョンでは jar tf を使用
異常系の代表例:
NoClassDefFoundError→ Manifest の Class-Path 指定漏れ or 参照解除済み jarNoSuchMethodError→ ライブラリバージョンの齟齬ClassCastExceptionin shaded jar → クラス名パッケージ変換の失敗
- トラブルシューティング:実務で得られた事例
依存衝突の実例
問題:
Logback 1.1.x と 1.2.x が同時引入され、ch.qos.logback.classic.LoggerContext の instance が不整合を生じる。
対策:
- 依存グラフ可視化ツール(
mvn dependency:tree -Dverbose)で発生箇所を特定 pom.xml/build.gradleで強制バージョン指定
<dependencyManagement>
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
</dependencies>
</dependencyManagement>
- FatJar プラグインで
Conflict Resolution→ForceReplace選択(※バージョン依存)
大きな JAR の慢性的問題
JAR サイズが 50 MB を超えると、起動時のクラスロード遅延が顕著になります。改善策として:
- 奥行き分割:OSGi モジュール構成で実装
- 軽量バージョン管理:FatJar 出力時に
--stripオプションで*.classの属性ブロック(SourceFile・LineTable)を削除 - 圧縮調整:
ZipEntries.CompressionMethod.DEFLATED指定かつ nivel 6 で再圧縮
- 安全性に関する補足
JAR 内蔵依存は、外部リポジトリにアクセスできない環境でも動作する一方で、セキュリティ・アップデートの追従が遅れるリスクがあります。以下を推奨:
mvn dependency:analyzeで未使用依存を件削- JAR 内
LICENSE.txt/NOTICE.txtを必ず含める - OpenID Connect や JWT ライブラリなど、PoC段階での利用は避ける
※この内容は公式プラグインドキュメントや Maven Central 依存関係レポートと照らし合わせて実施してください。