Spring Bootは、MavenおよびGradleのビルドツールプラグインを提供します。プラグインは、実行可能jarのパッケージ化など、さまざまな機能を提供します。このセクションでは、両方のプラグインの詳細と、サポートされていないビルドシステムを継承する必要がある場合のヘルプを提供します。始めたばかりの場合は、最初に「using-spring-boot.html」セクションの「using-spring-boot.html」を参照してください。

1. Spring Boot Mavenプラグイン

Spring Boot Mavenプラグインは、MavenでSpring Bootサポートを提供し、実行可能なjarまたはwarアーカイブをパッケージ化し、「インプレース」でアプリケーションを実行できます。使用するには、Maven 3.2(またはそれ以降)を使用する必要があります。

完全なプラグインのドキュメントについては、Spring Boot Mavenプラグインサイトを参照してください。

1.1. プラグインを含める

Spring Boot Mavenプラグインを使用するには、次の例に示すように、pom.xmlplugins セクションに適切なXMLを含めます。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!-- ... -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.2.4.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

上記の構成は、Mavenライフサイクルの package フェーズで構築されたjarまたはwarを再パッケージ化します。次の例は、target ディレクトリ内の元のjarと再パッケージ化されたjarの両方を示しています。

$ mvn package
$ ls target/*.jar
target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original

前の例に示すように <execution/> 構成を含めない場合、次の例に示すように、プラグインを単独で実行できます(ただし、パッケージのゴールが使用されている場合のみ)。

$ mvn package spring-boot:repackage
$ ls target/*.jar
target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original

マイルストーンまたはスナップショットリリースを使用する場合は、次のリストに示すように、適切な pluginRepository 要素も追加する必要があります。

<pluginRepositories>
    <pluginRepository>
        <id>spring-snapshots</id>
        <url>https://repo.spring.io/snapshot</url>
    </pluginRepository>
    <pluginRepository>
        <id>spring-milestones</id>
        <url>https://repo.spring.io/milestone</url>
    </pluginRepository>
</pluginRepositories>

1.2. 実行可能JarおよびWarファイルのパッケージ化

spring-boot-maven-pluginpom.xmlに含まれると、spring-boot:repackage ゴールを使用して、アーカイブを自動的に書き換えて実行可能にします。次の例に示すように、通常の packaging 要素を使用して、jarまたはwar(必要に応じて)をビルドするようにプロジェクトを構成する必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!-- ... -->
    <packaging>jar</packaging>
    <!-- ... -->
</project>

既存のアーカイブは、package フェーズでSpring Bootによって拡張されます。起動するメインクラスは、以下に示すように構成オプションを使用するか、マニフェストに Main-Class 属性を追加することで指定できます。メインクラスを指定しない場合、プラグインは public static void main(String[] args) メソッドでクラスを検索します。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <mainClass>com.example.app.Main</mainClass>
    </configuration>
</plugin>

プロジェクト成果物をビルドして実行するには、次のように入力できます。

$ mvn package
$ java -jar target/mymodule-0.0.1-SNAPSHOT.jar

実行可能かつ外部コンテナーにデプロイ可能なwarファイルをビルドするには、次の例に示すように、組み込みコンテナーの依存関係を“provided”としてマークする必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!-- ... -->
    <packaging>war</packaging>
    <!-- ... -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <!-- ... -->
    </dependencies>
</project>
デプロイ可能なwarファイルを作成する方法の詳細については、「howto.html」セクションを参照してください。

プラグイン情報ページで高度な設定オプションと例が利用できます。

2. Spring Boot Gradleプラグイン

Spring Boot Gradleプラグインは、GradleでSpring Bootサポートを提供し、実行可能なjarまたはwarアーカイブをパッケージ化し、Spring Bootアプリケーションを実行し、spring-boot-dependenciesが提供する依存関係管理を使用できるようにします。Gradleが必要です5.x (4.10もサポートされていますが、このサポートは非推奨であり、将来のリリースで削除される予定です。詳細については、プラグインのドキュメントを参照してください。

3. Spring Boot AntLibモジュール

Spring Boot AntLibモジュールは、Apache Antの基本的なSpring Bootサポートを提供します。モジュールを使用して実行可能jarを作成できます。モジュールを使用するには、次の例に示すように、build.xmlで追加の spring-boot 名前空間を宣言する必要があります。

<project xmlns:ivy="antlib:org.apache.ivy.ant"
    xmlns:spring-boot="antlib:org.springframework.boot.ant"
    name="myapp" default="build">
    ...
</project>

次の例に示すように、-lib オプションを使用してAntを開始することを忘れないでください。

$ ant -lib <folder containing spring-boot-antlib-2.2.4.RELEASE.jar>
「Spring Bootの使用」セクションには、 spring-boot-antlibでApache Antを使用するより完全な例が含まれています。

3.1. Spring Boot Antタスク

spring-boot-antlib 名前空間が宣言されると、次の追加タスクが利用可能になります。

3.1.1. spring-boot:exejar

exejar タスクを使用して、Spring Boot実行可能ファイルjarを作成できます。タスクでは次の属性がサポートされています。

属性説明必須

destfile

作成する宛先jarファイル

はい

classes

Javaクラスファイルのルートディレクトリ

はい

start-class

実行するメインアプリケーションクラス

いいえ(デフォルトは、main メソッドを宣言する最初に見つかったクラスです)

タスクでは、次のネストされた要素を使用できます。

要素説明

resources

作成されたjarファイルのコンテンツに追加されるリソース(Apache) のセットを記述する1つ以上のリソースコレクション(Apache)

lib

アプリケーションのランタイム依存性クラスパスを構成するjarライブラリのセットに追加する必要がある1つ以上のリソースコレクション(Apache)

3.1.2. サンプル

このセクションでは、Antタスクの2つの例を示します。

開始クラスを指定する
<spring-boot:exejar destfile="target/my-application.jar"
        classes="target/classes" start-class="com.example.MyApplication">
    <resources>
        <fileset dir="src/main/resources" />
    </resources>
    <lib>
        <fileset dir="lib" />
    </lib>
</spring-boot:exejar>
開始クラスを検出する
<exejar destfile="target/my-application.jar" classes="target/classes">
    <lib>
        <fileset dir="lib" />
    </lib>
</exejar>

3.2. spring-boot:findmainclass

findmainclass タスクは、mainを宣言するクラスを見つけるために exejar によって内部的に使用されます。必要に応じて、ビルドでこのタスクを直接使用することもできます。次の属性がサポートされています。

属性説明必須

classesroot

Javaクラスファイルのルートディレクトリ

はいmainclass が指定されていない場合)

mainclass

main クラス検索の短絡に使用できます

いいえ

property

結果で設定する必要があるAntプロパティ

いいえ(指定しない場合、結果が記録されます)

3.2.1. サンプル

このセクションには、findmainclassの3つの使用例が含まれています。

検索して記録する
<findmainclass classesroot="target/classes" />
検索と設定
<findmainclass classesroot="target/classes" property="main-class" />
オーバーライドして設定
<findmainclass mainclass="com.example.MainClass" property="main-class" />

4. 他のビルドシステムのサポート

Maven、Gradle、またはAnt以外のビルドツールを使用する場合は、おそらく独自のプラグインを開発する必要があります。実行可能jarは特定の形式に従う必要があり、特定のエントリは非圧縮形式で記述する必要があります(詳細については、付録の「 実行可能jar形式 」セクションを参照してください)。

Spring Boot MavenおよびGradleプラグインは、両方とも spring-boot-loader-tools を使用して実際にjarを生成します。必要に応じて、このライブラリを直接使用できます。

4.1. アーカイブの再パッケージ化

自己完結型の実行可能アーカイブになるように既存のアーカイブを再パッケージ化するには、org.springframework.boot.loader.tools.Repackagerを使用します。 Repackager クラスは、既存のjarまたはwarアーカイブを参照する単一のコンストラクター引数を取ります。2つの使用可能な repackage() メソッドのいずれかを使用して、元のファイルを置き換えるか、新しい宛先に書き込みます。リパッケージャーを実行する前に、さまざまな設定を構成することもできます。

4.2. ネストされたライブラリ

アーカイブを再パッケージするとき、org.springframework.boot.loader.tools.Libraries インターフェースを使用して、依存関係ファイルへの参照を含めることができます。 Libraries の具体的な実装は、ビルドシステム固有であるため、ここでは提供しません。

アーカイブにすでにライブラリが含まれている場合は、Libraries.NONEを使用できます。

4.3. メインクラスを見つける

Repackager.setMainClass() を使用してメインクラスを指定しない場合、リパッケージャはASM(英語) を使用してクラスファイルを読み取り、public static void main(String[] args) メソッドで適切なクラスを見つけようとします。複数の候補が見つかった場合、例外がスローされます。

4.4. 再パッケージの実装例

次の例は、典型的な再パッケージの実装を示しています。

Repackager repackager = new Repackager(sourceJarFile);
repackager.setBackupSource(false);
repackager.repackage(new Libraries() {
            @Override
            public void doWithLibraries(LibraryCallback callback) throws IOException {
                // Build system specific implementation, callback for each dependency
                // callback.library(new Library(nestedFile, LibraryScope.COMPILE));
            }
        });

5. 次のステップ

ビルドツールプラグインの機能に興味がある場合は、GitHubの spring-boot-tools (GitHub) モジュールを参照してください。実行可能なjar形式のより技術的な詳細については、付録で説明します。

特定のビルド関連の質問がある場合は、「 使い方 」ガイドを参照してください。

Unofficial Translation by spring.pleiades.io. See the original content.