Gradleでファットジャーを作る

Gradleでファットジャーを作成する

1. 概要

この簡単な記事では、Gradleで「ファットジャー」を作成する方法について説明します。

基本的に、a fat jar (also known as uber-jar) is a self-sufficient archive which contains both classes and dependencies needed to run an application.

2. 初期設定

2つの依存関係を持つJavaプロジェクトの単純なbuild.gradleファイルから始めましょう。

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
    compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
}

3. JavaプラグインからのJarタスクの使用

Java Gradleプラグインからjarタスクを変更することから始めましょう。 デフォルトでは、このタスクは依存関係のないjarを生成します。

数行のコードを追加することで、この動作を上書きできます。 動作させるには2つのことが必要です。

  • マニフェストファイルのMain-Class属性

  • 依存関係jarを含める

Gradleタスクにいくつかの変更を加えましょう。

jar {
    manifest {
        attributes "Main-Class": "com.example.fatjar.Application"
    }

    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

4. 別のタスクを作成する

元のjarタスクをそのまま残したい場合は、同じジョブを実行する別のjarタスクを作成できます。

次のコードは、customFatJar:という新しいタスクを追加します

task customFatJar(type: Jar) {
    manifest {
        attributes 'Main-Class': 'com.example.fatjar.Application'
    }
    baseName = 'all-in-one-jar'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

5. 専用プラグインの使用

ファットjarを作成するために、既存のGradleプラグインを使用することもできます。

この例では、Shadowプラグインを使用します。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.1'
    }
}

apply plugin: 'java'
apply plugin: 'com.github.johnrengelman.shadow'

Shadowプラグインを適用すると、shadowJarタスクを使用できるようになります。

6. 結論

このチュートリアルでは、Gradleでファットjarを作成するいくつかの異なる方法を紹介しました。 デフォルトのjarタスクをオーバーライドし、分離されたタスクを作成し、シャドウプラグインを使用しました。

どのアプローチが推奨されますか? 答えは-それは依存します。

単純なプロジェクトでは、デフォルトのjarタスクをオーバーライドするか、新しいタスクを作成するだけで十分です。 しかし、プロジェクトが成長するにつれて、プラグインを使用することを強くお勧めします。プラグインは、外部のMETA-INFファイルとの競合などのより困難な問題をすでに解決しているからです。

いつものように、このチュートリアルの完全な実装はover on GitHubにあります。