FAT JARを簡単に作る

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

JAVAのWEBアプリを実行する際はwar形式にして実行することが多いかと思いますが、spring bootなどのフレームワークではjarの中にtomcatなどのアプリケーションも含めてしまいjar形式で実行することができます。jarの中に色々なライブラリのjarも含めて1つのjarファイルにすることをfat jarと呼んだりします。
fat jarにすることで実行ファイルが1つにまとまるため、WEBアプリやバッチアプリの起動がお手軽にできるようになります。そこで今回はfat jarの簡単な作り方を紹介したいと思います。

fat jarを作ってみる

では、早速作ってみたいと思います。今回はgradleというビルドツールを使います。gradleはeclipse4.5では標準で使えるようになっているためeclipse4.5で作成します。
eclipseでファイル->その他->GradleからGradleプロジェクトを選択します。次へボタンをクリックしてプロジェクト名を入力し完了ボタンをクリックします。プロジェクトを作成するとデフォルトパッケージに「Library.java」とテストクラスの「LibraryTest.java」ファイルが作成されますが不要なので削除しておきます。
次に今回は簡単にログを出力する機能を実装したいと思いますのでログ出力に必要なlogbackのjarを追加します。
build.gradleファイルを開きます。dependenciesに「compile 'ch.qos.logback:logback-classic:1.1.3'」を追加します。追加したらプロジェクトを選択し、右クリックからGradle->Gradleプロジェクトのリフレッシュを選択します。プロジェクトと外部の依存関係を開いて見ましょう。jarファイルが追加されたのが分かります。
jarの追加

ログを出力するサンプルコードを用意します。

package sample;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Test {

    public static void main(String[] args) {
         Logger logger = LoggerFactory.getLogger(Test.class);
         logger.info("sample");
    }

}

ではこのプロジェクトをjarにして出力したいと思います。出力するのに必要な設定をbuild.gradleファイルに追加します。
追加する項目は3つになります。まず、buildscriptの追加です。これは外部ライブラリを使用してビルドするのに必要な設定です。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'eu.appsatori:gradle-fatjar-plugin:0.3'
    }
}

次にfat jar用のプラグインの追加。

apply plugin: 'eu.appsatori.fatjar'

最後に、fat jarを作成するためのタスクを追加します。baseNameが書き出したjarのファイル名になります。またここでマニフェストを追加することで実行可能jarになるようにしています。今回はsampleパッケージのTestクラスにメインメソッドがあるのでそれを指定します。

fatJar {
    baseName = 'sample'
    manifest {
        attributes 'Main-Class': 'sample.Test'
    }
}

以上で設定は完了です。最終的には以下のようになります。

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'eu.appsatori:gradle-fatjar-plugin:0.3'
    }
}


apply plugin: 'java'
apply plugin: 'eu.appsatori.fatjar'


repositories {
    jcenter()
}

dependencies {
    compile 'org.slf4j:slf4j-api:1.7.12'
    compile 'ch.qos.logback:logback-classic:1.1.3'

}

fatJar {
    baseName = 'sample'
    manifest {
        attributes 'Main-Class': 'sample.Test'
    }
}

jarを出力してみる

ではjarファイルを書き出します。 ウィンドウメニューからビューの表示->その他を選択し、GradleからGradleタスクを選択します。そうするとタスクの一覧が表示されますのでその中からfatJarをダブルクリックします。これでsample.jarが出力されます。
出力先はプロジェクト名->build->libsになります。ただしeclipseのパッケージエクスプローローラーからは参照できません。これはデフォルトであえて参照させないようにgradleプロジェクトの設定でフィルタがかかるようになっているためです。設定を変更して見えるようにしたい場合はプロジェクトを右クリックしてプロパティを選択し、リソースのリソースフィルタの除去対象からbuildの設定を削除してください。
ではjavaコマンドでjarを実行してみます。事項すると以下のようなログが出力されたのが分かります。

12:22:11.082 [main] INFO  sample.Test - sample

まとめ

いかがだったでしょうか。簡単にfat jarを作成することができたかと思います。
jar形式だと起動時に環境固有の値をパラメータとして付与して実行することができますので、AWSなどのクラウドで複数台サーバーがある環境とかで使用するのも便利だったりします。またAWSのラムダでjavaも使用できるようになりましたが、その際の実行形式もjarにする必要があるため、色々なjarライブラリを使用したい場合などはやはりfat jarにする必要があります。今回使用したgradleプロジェクトを作成することで簡単にfat jarを作れるのでぜひ試してみて下さい。