1. 概要

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

基本的に、 fat jar(uber-jarとも呼ばれます)は、アプリケーションの実行に必要なクラスと依存関係の両方を含む自給自足のアーカイブです。

2. 初期設定

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

apply plugin: 'java'

repositories {
    mavenCentral()
}

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

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

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

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

  • マニフェストファイルのMain-Class属性
  • 依存関係のjarファイルを含める

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

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

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

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

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

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

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

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

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

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

buildscript {
    repositories {
        mavenCentral()
        gradlePluginPortal()
    }
    dependencies {
        classpath "gradle.plugin.com.github.johnrengelman:shadow:7.1.2"
    }
}

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

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

6. 結論

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

どのアプローチが推奨されますか? 答えは–それは異なります。

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

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