1. 導入

Spring Boot Maven プラグインは、Apache Maven (英語) で Spring Boot サポートを提供します。統合テストを実行する前に、実行可能な jar または war アーカイブをパッケージ化し、Spring Boot アプリケーションを実行し、ビルド情報を生成して、Spring Boot アプリケーションを起動できます。

2. 入門

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

<project>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>getting-started</artifactId>
    <!-- ... -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

マイルストーンまたはスナップショットリリースを使用する場合は、次のように、適切な 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>

3. プラグインの使用

Maven ユーザーは、spring-boot-starter-parent プロジェクトから継承して、適切なデフォルトを取得できます。親プロジェクトは次の機能を提供します。

  • デフォルトのコンパイラーレベルとしての Java 1.8。

  • UTF-8 ソースエンコーディング。

  • -parameters を使用したコンパイル。

  • 共通の依存関係のバージョンを管理する、spring-boot-dependencies POM から継承された依存関係管理セクション。この依存関係管理により、独自の POM で使用するときに、これらの依存関係の <version> タグを省略できます。

  • repackage 実行 ID を使用した repackage ゴールの実行。

  • 実用的なリソースフィルタリング [Apache] (英語)

  • 実用的なプラグイン構成(git commit id [GitHub] (英語) 、および shade [Apache] (英語) )。

  • プロファイル固有のファイルを含む application.properties および application.yml の実用的なリソースフィルタリング (たとえば、application-dev.properties および application-dev.yml)

application.properties ファイルと application.yml ファイルは Spring スタイルのプレースホルダー(${…​})を受け入れるため、Maven フィルタリングは @..@ プレースホルダーを使用するように変更されています。(resource.delimiter と呼ばれる Maven プロパティを設定することにより、それをオーバーライドできます。)

3.1. 親スターター POM の継承

spring-boot-starter-parent から継承するようにプロジェクトを構成するには、parent を次のように設定します。

<!-- Inherit defaults from Spring Boot -->
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.6.6</version>
</parent>
この依存関係では、Spring Boot バージョン番号のみを指定する必要があります。追加のスターターをインポートする場合、バージョン番号を安全に省略できます。

この設定では、独自のプロジェクトのプロパティをオーバーライドすることで、個々の依存関係をオーバーライドすることもできます。たとえば、異なるバージョンの SLF4J ライブラリと Spring Data リリーストレインを使用するには、次のコードを pom.xml に追加します。

<properties>
    <slf4j.version>1.7.30</slf4j.version>
    <spring-data-releasetrain.version>Moore-SR6</spring-data-releasetrain.version>
</properties>

依存関係バージョンのプロパティの完全なリストについては、Spring Boot リファレンスで Dependency versions Appendix を参照してください。

3.2. 親 POM なしで Spring Boot を使用する

spring-boot-starter-parent POM から継承しない理由があるかもしれません。使用する必要がある独自の企業標準の親がいる場合や、すべての Maven 構成を明示的に宣言したい場合があります。

spring-boot-starter-parent を使用したくない場合でも、次のように import スコープの依存関係を使用することで、依存関係管理(プラグイン管理ではなく)の利点を維持できます。

<dependencyManagement>
    <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.6.6</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

上記のサンプルセットアップでは、上記で説明したように、プロパティを使用して個々の依存関係を上書きすることはできません。同じ結果を得るには、プロジェクトの dependencyManagement セクションのエントリを spring-boot-dependencies エントリのに追加する必要があります。たとえば、異なるバージョンの SLF4J ライブラリと Spring Data リリーストレインを使用するには、次の要素を pom.xml に追加します。

<dependencyManagement>
    <dependencies>
        <!-- Override SLF4J provided by Spring Boot -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>
        <!-- Override Spring Data release train provided by Spring Boot -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-releasetrain</artifactId>
            <version>2020.0.0-SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.6.6</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

3.3. コマンドラインでの設定の上書き

プラグインは、spring-boot から始まる多くのユーザープロパティを提供し、コマンドラインから構成をカスタマイズできるようにします。

たとえば、次のように、アプリケーションの実行時に有効になるようにプロファイルを調整できます。

$ mvn spring-boot:run -Dspring-boot.run.profiles=dev,local

コマンドラインでオーバーライドできるようにしながら両方にデフォルトを設定する場合は、ユーザー指定のプロジェクトプロパティと MOJO 構成を組み合わせて使用する必要があります。

<project>
    <properties>
        <app.profiles>local,dev</app.profiles>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <profiles>${app.profiles}</profiles>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

上記は、local と dev がデフォルトで有効になっていることを確認します。これで専用プロパティが公開されました。これはコマンドラインでも上書きできます。

$ mvn spring-boot:run -Dapp.profiles=test

4. ゴール

Spring Boot プラグインには次のゴールがあります。

ゴール 説明

spring-boot:build-image

buildpack を使用して、アプリケーションを OCI イメージにパッケージ化します。

spring-boot:build-info

現在の MavenProject の内容に基づいて build-info.properties ファイルを生成します。

spring-boot:help

spring-boot-maven-plugin に関するヘルプ情報を表示します。mvn spring-boot:help -Ddetail=true -Dgoal=<goal-name> を呼び出して、パラメーターの詳細を表示します。

spring-boot:repackage

java -jar を使用してコマンドラインから実行できるように、既存の JAR および WAR アーカイブを再パッケージ化します。layout=NONE を使用すると、ネストされた依存関係を持つ JAR を単純にパッケージ化することもできます(メインクラスがないため、実行可能ファイルではありません)。

spring-boot:run

アプリケーションを所定の場所で実行します。

spring-boot:start

Spring のアプリケーションを開始します。run のゴールに反して、これはブロックせず、他のゴールがアプリケーションで動作することを許可します。このゴールは、通常、テストスイートの前にアプリケーションが開始され、その後に停止される統合テストシナリオで使用されます。

spring-boot:stop

「開始」ゴールによって開始されたアプリケーションを停止します。通常、テストスイートが完了すると呼び出されます。

5. 実行可能アーカイブのパッケージ化

プラグインは、アプリケーションのすべての依存関係を含む実行可能アーカイブ(jar ファイルおよび war ファイル)を作成し、java -jar で実行できます。

実行可能アーカイブのパッケージ化は、次の例に示すように、repackage ゴールによって実行されます。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
spring-boot-starter-parent を使用している場合、そのような実行は repackage 実行 ID ですでに事前設定されているため、プラグイン定義のみを追加する必要があります。

上記の例では、Maven ライフサイクルのパッケージフェーズ中にビルドされた jar または war アーカイブを再パッケージします。これには、プロジェクトで定義されている provided 依存関係も含まれます。これらの依存関係の一部を除外する必要がある場合は、exclude オプションのいずれかを使用できます。詳細については、依存関係の除外を参照してください。

元の(実行不可能な)アーティファクトは、デフォルトで .original に名前が変更されますが、カスタム分類子を使用して元のアーティファクトを保持することもできます。

maven-war-plugin の outputFileNameMapping 機能は現在サポートされていません。

Devtools はデフォルトで自動的に除外されます(excludeDevtools プロパティを使用して制御できます)。これを war パッケージで機能させるには、spring-boot-devtools 依存関係を optional または provided スコープに設定する必要があります。

プラグインはマニフェストを書き換え、特に Main-Class および Start-Class エントリを管理します。デフォルトが機能しない場合は、jar プラグインではなく、Spring Boot プラグインで値を設定する必要があります。マニフェストの Main-Class は、次の例に示すように、Spring Boot プラグインの layout プロパティによって制御されます。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>${start.class}</mainClass>
                <layout>ZIP</layout>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

layout プロパティのデフォルトは、アーカイブ型(jar または war)によって決定される値です。次のレイアウトを使用できます。

  • JAR: 通常の実行可能 JAR レイアウト。

  • WAR: 実行可能な WAR レイアウト。provided 依存関係は、war がサーブレットコンテナーにデプロイされたときの衝突を避けるために WEB-INF/lib-provided に配置されます。

  • ZIP (別名 DIR): PropertiesLauncher を使用した JAR レイアウトに似ています。

  • NONE: すべての依存関係とプロジェクトリソースをバンドルします。ブートストラップローダーをバンドルしません。

5.1. 階層化された Jar または War

再パッケージ化された jar には、アプリケーションのクラスと依存関係がそれぞれ BOOT-INF/classes と BOOT-INF/lib に含まれています。同様に、実行可能 war には、アプリケーションのクラスが WEB-INF/classes に含まれ、依存関係が WEB-INF/lib と WEB-INF/lib-provided に含まれています。jar または war のコンテンツから docker イメージを作成する必要がある場合は、これらのディレクトリをさらに分離して、個別のレイヤーに書き込むことができると便利です。

階層化されたアーカイブは、通常の再パッケージ化された jar または war と同じレイアウトを使用しますが、各層を説明する追加のメタデータファイルが含まれています。

デフォルトでは、次のレイヤーが定義されています。

  • dependencies (バージョンに SNAPSHOT を含まない依存関係の場合)。

  • ローダークラスの spring-boot-loader

  • バージョンに SNAPSHOT が含まれる依存関係の snapshot-dependencies

  • ローカルモジュールの依存関係、アプリケーションクラス、リソース用の application

モジュールの依存関係は、現在のビルドの一部であるすべてのモジュールを調べることによって識別されます。モジュールの依存関係が Maven のローカルキャッシュにインストールされており、現在のビルドの一部ではないためにのみ解決できる場合、通常の依存関係として識別されます。

レイヤーの順序は、アプリケーションの一部が変更されたときに前のレイヤーがキャッシュされる可能性を決定するため、重要です。デフォルトの順序は dependenciesspring-boot-loadersnapshot-dependenciesapplication です。変更の可能性が最も低いコンテンツを最初に追加し、次に変更の可能性が高いレイヤーを追加する必要があります。

再パッケージ化されたアーカイブには、デフォルトで layers.idx ファイルが含まれています。この機能を無効にするには、次の方法で無効にします。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <layers>
                        <enabled>false</enabled>
                    </layers>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

[[packaging.layers.configuration =]] === カスタムレイヤー構成アプリケーションによっては、レイヤーの作成方法を調整し、新しいレイヤーを追加することができます。これは、以下に示すように登録する必要がある別の構成ファイルを使用して実行できます。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <layers>
                        <enabled>true</enabled>
                        <configuration>${project.basedir}/src/layers.xml</configuration>
                    </layers>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

構成ファイルには、アーカイブをレイヤーに分割する方法と、それらのレイヤーの順序が記述されています。次の例は、上記のデフォルトの順序を明示的に定義する方法を示しています。

<layers xmlns="http://www.springframework.org/schema/boot/layers"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/boot/layers
                          https://www.springframework.org/schema/boot/layers/layers-2.6.xsd">
    <application>
        <into layer="spring-boot-loader">
            <include>org/springframework/boot/loader/**</include>
        </into>
        <into layer="application" />
    </application>
    <dependencies>
        <into layer="application">
            <includeModuleDependencies />
        </into>
        <into layer="snapshot-dependencies">
            <include>*:*:*SNAPSHOT</include>
        </into>
        <into layer="dependencies" />
    </dependencies>
    <layerOrder>
        <layer>dependencies</layer>
        <layer>spring-boot-loader</layer>
        <layer>snapshot-dependencies</layer>
        <layer>application</layer>
    </layerOrder>
</layers>

layers XML 形式は、3 つのセクションで定義されています。

  • <application> ブロックは、アプリケーションクラスとリソースを階層化する方法を定義します。

  • <dependencies> ブロックは、依存関係の階層化方法を定義します。

  • <layerOrder> ブロックは、レイヤーが書き込まれる順序を定義します。

ネストされた <into> ブロックは、<application> および <dependencies> セクション内で使用され、レイヤーのコンテンツを要求します。ブロックは、定義された順序で上から下に評価されます。前のブロックで要求されていないコンテンツは、引き続き後続のブロックで検討できます。

<into> ブロックは、ネストされた <include> 要素と <exclude> 要素を使用してコンテンツを要求します。<application> セクションは、包含 / 除外式に Ant スタイルのパスマッチングを使用します。<dependencies> セクションは group:artifact[:version] パターンを使用します。また、ローカルモジュールの依存関係を含めたり除外したりするために使用できる <includeModuleDependencies /> および <excludeModuleDependencies /> 要素も提供します。

<include> が定義されていない場合、すべてのコンテンツ(前のブロックで要求されていない)が考慮されます。

<exclude> が定義されていない場合、除外は適用されません。

上記の <dependencies> の例を見ると、最初の <into> が application.layer のすべてのモジュール依存関係を要求していることがわかります。次の <into> は、snapshot-dependencies レイヤーのすべての SNAPSHOT 依存関係を要求します。最終的な <into> は、dependencies レイヤーに残っているもの(この場合、SNAPSHOT ではない依存関係)を要求します。

<application> ブロックにも同様のルールがあります。最初に spring-boot-loader レイヤーの org/springframework/boot/loader/** コンテンツを要求します。次に、application レイヤーの残りのクラスとリソースを要求します。

<into> ブロックが定義される順序は、多くの場合、レイヤーが書き込まれる順序とは異なります。このため、<layerOrder> 要素は常に含まれている必要があり<into> ブロックによって参照されるすべてのレイヤーをカバーする必要があります。

5.2. spring-boot:repackage

org.springframework.boot:spring-boot-maven-plugin:2.6.6

java -jar を使用してコマンドラインから実行できるように、既存の JAR および WAR アーカイブを再パッケージ化します。layout=NONE を使用すると、ネストされた依存関係を持つ JAR を単純にパッケージ化することもできます(メインクラスがないため、実行可能ファイルではありません)。

5.2.1. 必須パラメーター

名前 タイプ デフォルト

outputDirectory

File

${project.build.directory}

5.2.2. オプションのパラメーター

名前 タイプ デフォルト

attach

boolean

true

classifier

String

embeddedLaunchScript

File

embeddedLaunchScriptProperties

Properties

excludeDevtools

boolean

true

excludeGroupIds

String

excludes

List

executable

boolean

false

includeSystemScope

boolean

false

includes

List

layers

Layers (Javadoc)

layout

LayoutType (Javadoc)

layoutFactory

LayoutFactory (Javadoc)

mainClass

String

outputTimestamp

String

${project.build.outputTimestamp}

requiresUnpack

List

skip

boolean

false

5.2.3. パラメーターの詳細

attach

再パッケージ化されたアーカイブを添付して、ローカル Maven リポジトリにインストールするか、リモートリポジトリにデプロイします。分類子が構成されていない場合、通常の jar を置き換えます。classifier が通常の jar と再パッケージ化された jar が異なるように構成されている場合、通常の jar と一緒に接続されます。プロパティが false に設定されている場合、再パッケージ化されたアーカイブはインストールまたはデプロイされません。

名前

attach

タイプ

boolean

デフォルト値

true

ユーザープロパティ

開始

1.4.0

classifier

再パッケージ化されたアーカイブに追加する分類子。指定しない場合、メインのアーティファクトは再パッケージ化されたアーカイブに置き換えられます。指定された場合、分類子は、再パッケージ化するソースアーカイブの決定にも使用されます。その分類子を持つアーティファクトがすでに存在する場合、ソースとして使用され、置き換えられます。そのようなアーティファクトが存在しない場合、メインアーティファクトがソースとして使用され、再パッケージ化されたアーカイブがその分類子の補足アーティファクトとして添付されます。アーティファクトを添付すると、元のアーティファクトと一緒にデプロイできます。$1 [$2] を参照してください。

名前

classifier

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

開始

1.0.0

embeddedLaunchScript

jar が完全に実行可能な場合、jar の前に追加する埋め込み起動スクリプト。指定しない場合は、"Spring Boot" デフォルトスクリプトが使用されます。

名前

embeddedLaunchScript

タイプ

java.io.File

デフォルト値

ユーザープロパティ

開始

1.3.0

embeddedLaunchScriptProperties

埋め込み起動スクリプトで展開する必要があるプロパティ。

名前

embeddedLaunchScriptProperties

タイプ

java.util.Properties

デフォルト値

ユーザープロパティ

開始

1.3.0

excludeDevtools

再パッケージ化されたアーカイブから Spring Boot devtools を除外します。

名前

excludeDevtools

タイプ

boolean

デフォルト値

true

ユーザープロパティ

spring-boot.repackage.excludeDevtools

開始

1.3.0

excludeGroupIds

除外する groupId 名のコンマ区切りリスト(完全一致)。

名前

excludeGroupIds

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

spring-boot.excludeGroupIds

開始

1.1.0

excludes

除外するアーティファクト定義のコレクション。Exclude 要素は、必須の groupId および artifactId プロパティと、オプションの classifier プロパティを定義します。

名前

excludes

タイプ

java.util.List

デフォルト値

ユーザープロパティ

spring-boot.excludes

開始

1.1.0

executable

起動スクリプトを jar の先頭に追加して、*nix マシン用の完全に実行可能な jar を作成します。<p> 現在、一部のツールはこの形式を受け入れないため、常にこの手法を使用できるとは限りません。例: jar -xf は、完全に実行可能にされた jar または war の抽出に暗黙的に失敗する場合があります。このオプションは、java -jar で実行したり、サーブレットコンテナーにデプロイしたりするのではなく、直接実行する場合にのみ有効にすることをお勧めします。

名前

executable

タイプ

boolean

デフォルト値

false

ユーザープロパティ

開始

1.3.0

includeSystemScope

システムスコープの依存関係を含めます。

名前

includeSystemScope

タイプ

boolean

デフォルト値

false

ユーザープロパティ

開始

1.4.0

includes

含めるアーティファクト定義のコレクション。Include 要素は、必須の groupId および artifactId プロパティと、オプションの必須の groupId および artifactId プロパティ、およびオプションの classifier プロパティを定義します。

名前

includes

タイプ

java.util.List

デフォルト値

ユーザープロパティ

spring-boot.includes

開始

1.2.0

layers

レイヤーの作成を無効にし、レイヤーツール jar を除外し、カスタムレイヤー構成ファイルを提供するオプションを備えたレイヤー構成。

名前

layers

タイプ

org.springframework.boot.maven.Layers (Javadoc)

デフォルト値

ユーザープロパティ

開始

2.3.0

layout

アーカイブの型(依存関係がアーカイブ内にどのように配置されているかに対応します)。可能な値は JARWARZIPDIRNONE です。デフォルトは、アーカイブ型に基づく推測です。

名前

layout

タイプ

org.springframework.boot.maven.AbstractPackagerMojo$LayoutType (Javadoc)

デフォルト値

ユーザープロパティ

spring-boot.repackage.layout

開始

1.0.0

layoutFactory

明示的なレイアウトが設定されていない場合に実行可能アーカイブを作成するために使用されるレイアウトファクトリ。サードパーティが代替レイアウトの実装を提供できます。

名前

layoutFactory

タイプ

org.springframework.boot.loader.tools.LayoutFactory (Javadoc)

デフォルト値

ユーザープロパティ

開始

1.5.0

mainClass

メインクラスの名前。指定しない場合、main メソッドを含む最初に見つかったコンパイル済みクラスが使用されます。

名前

mainClass

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

開始

1.0.0

outputDirectory

生成されたアーカイブを含むディレクトリ。

名前

outputDirectory

タイプ

java.io.File

デフォルト値

${project.build.directory}

ユーザープロパティ

開始

1.0.0

outputTimestamp

ISO 8601(yyyy-MM-dd’T’HH:mm:ssXXX)またはエポックからの秒数を表す int としてフォーマットされた、再現可能な出力アーカイブエントリのタイムスタンプ。

名前

outputTimestamp

タイプ

java.lang.String

デフォルト値

${project.build.outputTimestamp}

ユーザープロパティ

開始

2.3.0

requiresUnpack

実行するためにファット jar から解凍する必要があるライブラリのリスト。各ライブラリを <dependency> として指定し、<groupId> および <artifactId> を指定すると、実行時に解凍されます。

名前

requiresUnpack

タイプ

java.util.List

デフォルト値

ユーザープロパティ

開始

1.1.0

skip

実行をスキップします。

名前

skip

タイプ

boolean

デフォルト値

false

ユーザープロパティ

spring-boot.repackage.skip

開始

1.2.0

5.3. サンプル

5.3.1. カスタム分類子

デフォルトでは、repackage ゴールは元のアーティファクトを再パッケージ化されたアーティファクトに置き換えます。これは、アプリケーションを表すモジュールの正常な動作ですが、モジュールが別のモジュールの依存関係として使用される場合、再パッケージ化されたモジュールの分類子を提供する必要があります。その理由は、依存クラスが再パッケージ化された jar のクラスをロードできないように、アプリケーションクラスが BOOT-INF/classes にパッケージ化されているためです。

その場合、または元のアーティファクトを保持し、別の分類子を使用して再パッケージ化されたアーティファクトを添付する場合は、次の例に示すようにプラグインを構成します。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <classifier>exec</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

spring-boot-starter-parent を使用している場合、repackage ゴールは ID repackage の実行で自動的に実行されます。そのセットアップでは、次の例に示すように、構成のみを指定する必要があります。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <configuration>
                            <classifier>exec</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

この構成では、2 つのアーティファクトが生成されます。元のアーティファクトと、再パッケージ化のゴールによって生成された再パッケージ化されたカウンターパートです。両方とも透過的にインストール / デプロイされます。

メインアーティファクトが置き換えられるのと同じメソッドでセカンダリアーティファクトを再パッケージ化する場合も、同じ構成を使用できます。次の構成は、再パッケージ化されたアプリケーションとともに単一の task 分類アーティファクトをインストール / デプロイします。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                        <phase>package</phase>
                        <configuration>
                            <classifier>task</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <classifier>task</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

maven-jar-plugin と spring-boot-maven-plugin の両方が同じフェーズで実行されるため、jar プラグインを最初に定義することが重要です(再パッケージ化のゴールの前に実行されるように)。再び、spring-boot-starter-parent を使用している場合、これは次のように簡略化できます。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                    <execution>
                        <id>default-jar</id>
                        <configuration>
                            <classifier>task</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <configuration>
                            <classifier>task</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

5.3.2. カスタム名

再パッケージ化された jar に、プロジェクトの artifactId 属性で定義されたものとは異なるローカル名を付ける必要がある場合は、次の例に示すように、標準の finalName を使用します。

<project>
    <build>
        <finalName>my-app</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

この構成により、target/my-app.jar に再パッケージ化されたアーティファクトが生成されます。

5.3.3. ローカルで再パッケージ化されたアーティファクト

デフォルトでは、repackage のゴールは、元の成果物を実行可能な成果物に置き換えます。元の jar のみをデプロイし、それでも通常のファイル名でアプリを実行できる必要がある場合は、次のようにプラグインを構成します。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <attach>false</attach>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

この構成では、2 つのアーティファクトが生成されます。元のアーティファクトと、repackage ゴールによって生成された実行可能なカウンターパートです。オリジナルのもののみがインストール / デプロイされます。

5.3.4. カスタムレイアウト

Spring Boot は、ビルドプラグインへの依存関係として提供される追加の jar ファイルで定義されたカスタムレイアウトファクトリを使用して、このプロジェクトの jar ファイルを再パッケージ化します。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <layoutFactory implementation="com.example.CustomLayoutFactory">
                                <customProperty>value</customProperty>
                            </layoutFactory>
                        </configuration>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>com.example</groupId>
                        <artifactId>custom-layout</artifactId>
                        <version>0.0.1.BUILD-SNAPSHOT</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>

レイアウトファクトリは、pom で明示的に指定された LayoutFactory (spring-boot-loader-tools から)の実装として提供されます。プラグインクラスパスにカスタム LayoutFactory が 1 つだけあり、それが META-INF/spring.factories にリストされている場合、プラグイン構成で明示的に設定する必要はありません。

明示的なレイアウトが設定されている場合、レイアウトファクトリは常に無視されます。

5.3.5. 依存関係の除外

デフォルトでは、repackage と run の両方のゴールには、プロジェクトで定義されている provided の依存関係が含まれます。Spring Boot プロジェクトは、provided 依存関係を、アプリケーションの実行に必要な「コンテナー」依存関係と見なす必要があります。

これらの依存関係の一部はまったく必要ない場合があり、実行可能な jar から除外する必要があります。一貫性を保つために、アプリケーションの実行時にも存在しないようにする必要があります。

実行時にパッケージ化 / 使用から依存関係を除外する方法は 2 つあります。

  • groupId および artifactId で識別される特定のアーティファクトを除外します。必要に応じて、オプションで classifier を使用します。

  • 特定の groupId に属するアーティファクトを除外します。

次の例では、com.example:module1 を除外し、その成果物のみを除外します。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>com.example</groupId>
                            <artifactId>module1</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

この例では、com.example グループに属するアーティファクトを除外します。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludeGroupIds>com.example</excludeGroupIds>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

5.3.6. 階層化されたアーカイブツール

階層化された jar または war が作成されると、spring-boot-jarmode-layertools jar が依存関係としてアーカイブに追加されます。クラスパス上のこの jar を使用すると、特別なモードでアプリケーションを起動できます。これにより、ブートストラップコードで、アプリケーションとはまったく異なるもの(たとえば、レイヤーを抽出するもの)を実行できます。この依存関係を除外する場合は、次の方法で行うことができます。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <layers>
                        <includeLayerTools>false</includeLayerTools>
                    </layers>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

5.3.7. カスタムレイヤー構成

デフォルトのセットアップでは、依存関係がスナップショットと非スナップショットに分割されますが、より複雑なルールがある場合があります。例: プロジェクトの会社固有の依存関係を専用レイヤーに分離したい場合があります。次の layers.xml 構成は、そのような設定の 1 つを示しています。

<layers xmlns="http://www.springframework.org/schema/boot/layers"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/boot/layers
                          https://www.springframework.org/schema/boot/layers/layers-2.6.xsd">
    <application>
        <into layer="spring-boot-loader">
            <include>org/springframework/boot/loader/**</include>
        </into>
        <into layer="application" />
    </application>
    <dependencies>
        <into layer="snapshot-dependencies">
            <include>*:*:*SNAPSHOT</include>
        </into>
        <into layer="company-dependencies">
            <include>com.acme:*</include>
        </into>
        <into layer="dependencies"/>
    </dependencies>
    <layerOrder>
        <layer>dependencies</layer>
        <layer>spring-boot-loader</layer>
        <layer>snapshot-dependencies</layer>
        <layer>company-dependencies</layer>
        <layer>application</layer>
    </layerOrder>
</layers>

上記の構成では、com.acme groupId を持つすべてのライブラリで追加の company-dependencies レイヤーを作成します。

6. OCI イメージのパッケージ化

プラグインは、Cloud Native Buildpacks (英語) (CNB)を使用して jar または war ファイルから OCI イメージ [GitHub] (英語) を作成できます。build-image ゴールを使用してイメージを構築できます。

セキュリティ上の理由から、イメージは root 以外のユーザーとしてビルドおよび実行されます。詳細については、CNB 仕様 (英語) を参照してください。

開始する最も簡単な方法は、プロジェクトで mvn spring-boot:build-image を呼び出すことです。次の例に示すように、package フェーズが呼び出されるたびに、イメージの作成を自動化できます。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>build-image</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
buildpack は実行可能アーカイブから実行されますが、実行可能アーカイブは必要に応じて自動的に作成されるため、最初に repackage ゴールを実行する必要はありません。build-image がアプリケーションを再パッケージ化すると、repackage のゴールと同じ設定が適用されます。つまり、除外オプションの 1 つを使用して依存関係を除外でき、デフォルトで Devtools が自動的に除外されます(excludeDevtools プロパティを使用して制御できます)。

6.1. Docker デーモン

build-image ゴールには、Docker デーモンへのアクセスが必要です。デフォルトでは、ローカル接続を介して Docker デーモンと通信します。これは、構成されていないすべてのサポートされているプラットフォーム上の Docker エンジン (英語) で動作します。

minikube が提供する Docker デーモン (英語) を使用するように build-image ゴールを構成するように環境変数を設定できます。次の表は、環境変数とその値を示しています。

環境変数 説明

DOCKER_HOST

Docker デーモンのホストとポートを含む URL- 例: tcp://192.168.99.100:2376

DOCKER_TLS_VERIFY

1 に設定されている場合、安全な HTTPS プロトコルを有効にする (オプション)

DOCKER_CERT_PATH

HTTPS の証明書とキーファイルへのパス (DOCKER_TLS_VERIFY=1 の場合は必須、それ以外の場合は無視)

Linux および macOS では、これらの環境変数は、minikube の起動後にコマンド eval $(minikube docker-env) を使用して設定できます。

Docker デーモン接続情報は、プラグイン構成の docker パラメーターを使用して提供することもできます。次の表は、使用可能なパラメーターをまとめたものです。

パラメーター 説明

host

Docker デーモンのホストとポートを含む URL- 例: tcp://192.168.99.100:2376

tlsVerify

true に設定されている場合、安全な HTTPS プロトコルを有効にする (オプション)

certPath

HTTPS の証明書とキーファイルへのパス (tlsVerify が true の場合は必須、それ以外の場合は無視されます)

詳細については、も参照してください。

6.2. Docker レジストリ

builder または runImage パラメーターで指定された Docker イメージが、認証を必要とするプライベート Docker イメージレジストリに保管されている場合、認証資格情報は docker.builderRegistry パラメーターを使用して提供できます。

生成された Docker イメージを Docker イメージレジストリに公開する場合は、docker.publishRegistry パラメーターを使用して認証資格情報を提供できます。

ユーザー認証または ID トークン認証用のパラメーターが提供されます。サポートされている認証方法の詳細については、イメージの保存に使用されている Docker レジストリのドキュメントを参照してください。

次の表は、docker.builderRegistry および docker.publishRegistry で使用可能なパラメーターを要約したものです。

パラメーター 説明

username

Docker イメージレジストリユーザーのユーザー名。ユーザー認証に必要です。

password

Docker イメージレジストリユーザーのパスワード。ユーザー認証に必要です。

url

Docker イメージレジストリのアドレス。ユーザー認証のオプション。

email

Docker イメージレジストリユーザーのメールアドレス。ユーザー認証のオプション。

token

Docker イメージレジストリユーザーの ID トークン。トークン認証に必要です。

詳細については、も参照してください。

6.3. イメージのカスタマイズ

プラグインはビルダー (英語) を呼び出して、イメージの生成を調整します。ビルダーには、生成されたイメージに影響を与えるためにアプリケーションをインスペクションできる複数の buildpacks が含 (英語) まれています。デフォルトでは、プラグインはビルダーイメージを選択します。生成されたイメージの名前は、プロジェクトのプロパティから推測されます。

image パラメーターを使用すると、ビルダーの構成と、プロジェクトでの動作方法を設定できます。次の表は、使用可能なパラメーターとそのデフォルト値をまとめたものです。

パラメーター / (ユーザープロパティ) 説明 デフォルト値

builder
(spring-boot.build-image.builder)

Name of the Builder image to use.

paketobuildpacks/builder:base

runImage
(spring-boot.build-image.runImage)

Name of the run image to use.

No default value, indicating the run image specified in Builder metadata should be used.

name
(spring-boot.build-image.imageName)

Image name (Javadoc) for the generated image.

docker.io/library/
${project.artifactId}:${project.version}

pullPolicy
(spring-boot.build-image.pullPolicy)

Policy (Javadoc) used to determine when to pull the builder and run images from the registry. Acceptable values are ALWAYS, NEVER, and IF_NOT_PRESENT.

ALWAYS

env

ビルダーに渡す必要のある環境変数。

buildpacks

ビルダーがイメージをビルドするときに使用する必要がある Buildpacks。指定された buildpacks のみが使用され、ビルダーに含まれているデフォルトの buildpacks がオーバーライドされます。Buildpack 参照は、次のいずれかの形式である必要があります。

  • ビルダーの Buildpack - [urn:cnb:builder:]<buildpack ID>[@<version>]

  • ファイルシステム上のディレクトリ内の Buildpack- [file://]<path>

  • ファイルシステム上の gzip 圧縮された tar(.tgz)ファイル内の Buildpack- [file://]<path>/<file name>

  • OCI イメージの Buildpack- [docker://]<host>/<repo>[:<tag>][@<digest>]

なし。ビルダーがそれに含まれる buildpacks を使用する必要があることを示します。

bindings

イメージをビルドするときにビルダーコンテナーにマウントする必要があるボリュームバインドマウント (英語) 。バインディングは、ビルダーコンテナーの作成時に、解析されず、検証されずに Docker に渡されます。バインディングは、次のいずれかの形式である必要があります。

  • <host source path>:<container destination path>[:<options>]

  • <host volume name>:<container destination path>[:<options>]

<options> に含めることができる場所:

  • ボリュームを読み取り専用としてコンテナーにマウントする ro 

  • ボリュームをコンテナー内で読み取り可能および書き込み可能としてマウントするための rw 

  • オプション名とその値で構成されるキーと値のペアを指定する volume-opt=key=value 

network
(spring-boot.build-image.network)

The network driver (英語) the builder container will be configured to use. The value supplied will be passed unvalidated to Docker when creating the builder container.

cleanCache
(spring-boot.build-image.cleanCache)

Whether to clean the cache before building.

false

verboseLogging

ビルダー操作の詳細ログを有効にします。

false

publish
(spring-boot.build-image.publish)

Whether to publish the generated image to a Docker registry.

false

tags

生成されたイメージに適用する 1 つ以上の追加タグ。

caches

ランダムな名前を生成する代わりに、ビルダーが使用する必要があるボリューム名をキャッシュします。

buildCache

buildpacks によって作成され、イメージ構築プロセスによって使用されるレイヤーを含むキャッシュ。

イメージ名から派生した名前を持つ、Docker デーモン内の名前付きボリューム。

launchCache

buildpacks によって作成され、イメージ起動プロセスによって使用されるレイヤーを含むキャッシュ。

イメージ名から派生した名前を持つ、Docker デーモン内の名前付きボリューム。

プラグインは、コンパイラーのプラグイン構成または maven.compiler.target プロパティを使用して、プロジェクトのターゲット Java 互換性を検出します。デフォルトの Paketo ビルダーと buildpacks を使用する場合、プラグインは buildpacks に同じ Java バージョンをインストールするように指示します。ビルダーの構成例に示されているように、この動作をオーバーライドできます。

詳細については、も参照してください。

6.4. spring-boot:build-image

org.springframework.boot:spring-boot-maven-plugin:2.6.6

buildpack を使用して、アプリケーションを OCI イメージにパッケージ化します。

6.4.1. 必須パラメーター

名前 タイプ デフォルト

sourceDirectory

File

${project.build.directory}

6.4.3. パラメーターの詳細

classifier

ソースアーカイブを検索するときに使用される分類子。

名前

classifier

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

開始

2.3.0

docker

Docker 構成オプション。

名前

docker

タイプ

org.springframework.boot.maven.Docker (Javadoc)

デフォルト値

ユーザープロパティ

開始

2.4.0

excludeDevtools

再パッケージ化されたアーカイブから Spring Boot devtools を除外します。

名前

excludeDevtools

タイプ

boolean

デフォルト値

true

ユーザープロパティ

spring-boot.repackage.excludeDevtools

開始

1.3.0

excludeGroupIds

除外する groupId 名のコンマ区切りリスト(完全一致)。

名前

excludeGroupIds

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

spring-boot.excludeGroupIds

開始

1.1.0

excludes

除外するアーティファクト定義のコレクション。Exclude 要素は、必須の groupId および artifactId プロパティと、オプションの classifier プロパティを定義します。

名前

excludes

タイプ

java.util.List

デフォルト値

ユーザープロパティ

spring-boot.excludes

開始

1.1.0

image

builderrunImagenameenvcleanCacheverboseLoggingpullPolicypublish オプションを使用したイメージ構成。

名前

image

タイプ

org.springframework.boot.maven.Image (Javadoc)

デフォルト値

ユーザープロパティ

開始

2.3.0

includeSystemScope

システムスコープの依存関係を含めます。

名前

includeSystemScope

タイプ

boolean

デフォルト値

false

ユーザープロパティ

開始

1.4.0

includes

含めるアーティファクト定義のコレクション。Include 要素は、必須の groupId および artifactId プロパティと、オプションの必須の groupId および artifactId プロパティ、およびオプションの classifier プロパティを定義します。

名前

includes

タイプ

java.util.List

デフォルト値

ユーザープロパティ

spring-boot.includes

開始

1.2.0

layers

レイヤーの作成を無効にし、レイヤーツール jar を除外し、カスタムレイヤー構成ファイルを提供するオプションを備えたレイヤー構成。

名前

layers

タイプ

org.springframework.boot.maven.Layers (Javadoc)

デフォルト値

ユーザープロパティ

開始

2.3.0

layout

アーカイブの型(依存関係がアーカイブ内にどのように配置されているかに対応します)。可能な値は JARWARZIPDIRNONE です。デフォルトは、アーカイブ型に基づく推測です。

名前

layout

タイプ

org.springframework.boot.maven.AbstractPackagerMojo$LayoutType (Javadoc)

デフォルト値

ユーザープロパティ

開始

2.3.11

layoutFactory

明示的なレイアウトが設定されていない場合に実行可能アーカイブを作成するために使用されるレイアウトファクトリ。サードパーティが代替レイアウトの実装を提供できます。

名前

layoutFactory

タイプ

org.springframework.boot.loader.tools.LayoutFactory (Javadoc)

デフォルト値

ユーザープロパティ

開始

2.3.11

mainClass

メインクラスの名前。指定しない場合、main メソッドを含む最初に見つかったコンパイル済みクラスが使用されます。

名前

mainClass

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

開始

1.0.0

skip

実行をスキップします。

名前

skip

タイプ

boolean

デフォルト値

false

ユーザープロパティ

spring-boot.build-image.skip

開始

2.3.0

sourceDirectory

ソースアーカイブを含むディレクトリ。

名前

sourceDirectory

タイプ

java.io.File

デフォルト値

${project.build.directory}

ユーザープロパティ

開始

2.3.0

6.5. サンプル

6.5.1. カスタムイメージビルダー

イメージの作成に使用されるビルダーまたはビルドされたイメージの起動に使用される実行イメージをカスタマイズする必要がある場合は、次の例に示すようにプラグインを構成します。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <builder>mine/java-cnb-builder</builder>
                        <runImage>mine/java-cnb-run</runImage>
                    </image>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

この構成では、名前 mine/java-cnb-builder およびタグ latest のビルダーイメージ、および mine/java-cnb-run という名前の実行イメージとタグ latest を使用します。

この例に示すように、ビルダーと実行イメージはコマンドラインでも指定できます。

$ mvn spring-boot:build-image -Dspring-boot.build-image.builder=mine/java-cnb-builder -Dspring-boot.build-image.runImage=mine/java-cnb-run

6.5.2. ビルダー構成

ビルダーが環境変数を使用して構成オプションを公開する場合、env 属性を使用して設定できます。

以下は、ビルド時に Paketo Java buildpacks によって使用される JVM バージョンを構成する例 (英語) です。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <env>
                            <BP_JVM_VERSION>8.*</BP_JVM_VERSION>
                        </env>
                    </image>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

ビルダーが実行されている Docker デーモンと buildpacks がアーティファクトをダウンロードするネットワークの場所の間にネットワークプロキシがある場合は、プロキシを使用するようにビルダーを構成する必要があります。Paketo ビルダーを使用する場合、これは、次の例に示すように、HTTPS_PROXY および / または HTTP_PROXY 環境変数を設定することで実現できます。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <env>
                            <HTTP_PROXY>http://proxy.example.com</HTTP_PROXY>
                            <HTTPS_PROXY>https://proxy.example.com</HTTPS_PROXY>
                        </env>
                    </image>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

6.5.3. ランタイム JVM 構成

Paketo Java buildpacks は、JAVA_TOOL_OPTIONS 環境変数を設定することにより、JVM ランタイム環境を構成 (英語) します。ビルドパックが提供する JAVA_TOOL_OPTIONS 値を変更して、アプリケーションイメージがコンテナーで起動されたときの JVM ランタイムの動作をカスタマイズできます。

イメージに保存してすべてのデプロイに適用する必要がある環境変数の変更は、Paketo ドキュメント (英語) に従って設定でき、次の例に示されています。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <env>
                            <BPE_DELIM_JAVA_TOOL_OPTIONS xml:space="preserve"> </BPE_DELIM_JAVA_TOOL_OPTIONS>
                            <BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:+HeapDumpOnOutOfMemoryError</BPE_APPEND_JAVA_TOOL_OPTIONS>
                        </env>
                    </image>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

6.5.4. カスタムイメージ名

デフォルトでは、イメージ名はプロジェクトの artifactId および version から推測されます(docker.io/library/${project.artifactId}:${project.version} など)。次の例に示すように、名前を制御できます。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <name>example.com/library/${project.artifactId}</name>
                    </image>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
この構成では明示的なタグが提供されないため、latest が使用されます。${project.version}、ビルドで使用可能な任意のプロパティ、ハードコードされたバージョンのいずれかを使用して、タグを指定することもできます。

次の例に示すように、イメージ名はコマンドラインでも指定できます。

$ mvn spring-boot:build-image -Dspring-boot.build-image.imageName=example.com/library/my-app:v1

6.5.5. Buildpacks

デフォルトでは、ビルダーはビルダーイメージに含まれている buildpacks を使用し、事前定義された順序で適用します。buildpacks の代替セットを提供して、ビルダーに含まれていない buildpacks を適用したり、含まれている buildpacks の順序を変更したりできます。1 つ以上の buildpacks が提供されている場合、指定された buildpacks のみが適用されます。

次の例では、.tgz ファイルにパッケージ化されたカスタム buildpack を使用し、その後にビルダーに含まれる buildpack を使用するようにビルダーに指示します。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <buildpacks>
                            <buildpack>file:///path/to/example-buildpack.tgz</buildpack>
                            <buildpack>urn:cnb:builder:paketo-buildpacks/java</buildpack>
                        </buildpacks>
                    </image>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Buildpacks は、以下に示す任意の形式で指定できます。

CNB ビルダーにある buildpack(ビルダーに buildpack-id に一致する buildpack が 1 つしかない場合は、バージョンを省略できます):

buildpack コンテンツを含むディレクトリへのパス(Windows ではサポートされていません):

  • file:///path/to/buildpack/

  • /path/to/buildpack/

buildpack コンテンツを含む gzip 圧縮された tar ファイルへのパス:

  • file:///path/to/buildpack.tgz

  • /path/to/buildpack.tgz

  • docker://example/buildpack

  • docker:///example/buildpack:latest

  • docker:///example/buildpack@sha256:45b23dee08…​

  • example/buildpack

  • example/buildpack:latest

  • example/buildpack@sha256:45b23dee08…​

6.5.6. イメージ公開

生成されたイメージは、publish オプションを有効にし、docker.publishRegistry パラメーターを使用してレジストリの認証を構成することにより、Docker レジストリに公開できます。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <name>docker.example.com/library/${project.artifactId}</name>
                        <publish>true</publish>
                    </image>
                    <docker>
                        <publishRegistry>
                            <username>user</username>
                            <password>secret</password>
                            <url>https://docker.example.com/v1/</url>
                            <email>[email protected] (英語)  </email>
                        </publishRegistry>
                    </docker>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

この例に示すように、publish オプションはコマンドラインでも指定できます。

$ mvn spring-boot:build-image -Dspring-boot.build-image.imageName=docker.example.com/library/my-app:v1 -Dspring-boot.build-image.publish=true

6.5.7. Builder キャッシュ構成

CNB ビルダーは、イメージのビルドおよび起動時に使用されるレイヤーをキャッシュします。デフォルトでは、これらのキャッシュは、ターゲットイメージのフルネームから派生した名前で Docker デーモンに名前付きボリュームとして保存されます。プロジェクトのバージョンがイメージ名のタグとして使用されている場合など、イメージ名が頻繁に変更される場合、キャッシュが頻繁に無効化される可能性があります。

次の例に示すように、キャッシュボリュームは、代替名を使用してキャッシュライフサイクルをより細かく制御できるように構成できます。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <buildCache>
                            <volume>
                                <name>cache-${project.artifactId}.build</name>
                            </volume>
                        </buildCache>
                        <launchCache>
                            <volume>
                                <name>cache-${project.artifactId}.launch</name>
                            </volume>
                        </launchCache>
                    </image>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

6.5.8. Docker の設定

デフォルトのローカル接続の代わりにリモート接続を使用して Docker デーモンと通信するプラグインが必要な場合は、次の例に示すように、docker パラメーターを使用して接続の詳細を提供できます。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <docker>
                        <host>tcp://192.168.99.100:2376</host>
                        <tlsVerify>true</tlsVerify>
                        <certPath>/home/user/.minikube/certs</certPath>
                    </docker>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

ビルダーまたは実行イメージがユーザー認証をサポートするプライベート Docker レジストリに保管されている場合、次の例に示すように、docker.builderRegistry パラメーターを使用して認証の詳細を提供できます。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <docker>
                        <builderRegistry>
                            <username>user</username>
                            <password>secret</password>
                            <url>https://docker.example.com/v1/</url>
                            <email>[email protected] (英語)  </email>
                        </builderRegistry>
                    </docker>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

ビルダーまたは実行イメージがトークン認証をサポートするプライベート Docker レジストリに保管されている場合、次の例に示すように、docker.builderRegistry パラメーターを使用してトークン値を提供できます。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <docker>
                        <builderRegistry>
                            <token>9cbaf023786cd7...</token>
                        </builderRegistry>
                    </docker>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

7. Maven でアプリケーションを実行する

プラグインには、次の例に示すように、コマンドラインからアプリケーションを起動するために使用できる実行ゴールが含まれています。

$ mvn spring-boot:run

アプリケーション引数は、arguments パラメーターを使用して指定できます。詳細については、アプリケーション引数の使用を参照してください。

デフォルトでは、アプリケーションはフォークされたプロセスで実行され、コマンドラインでプロパティを設定してもアプリケーションには影響しません。いくつかの JVM 引数を指定する必要がある場合(つまり、デバッグ目的で)、jvmArguments パラメーターを使用できます。詳細については、アプリケーションをデバッグするを参照してください。システムプロパティ環境変数も明示的にサポートされています。

プロファイルを有効にすることは非常に一般的であるため、-Dspring-boot.run.jvmArguments="-Dspring.profiles.active=dev" のショートカットを提供する専用の profiles プロパティがあります。アクティブなプロファイルを指定するを参照してください。

これは推奨されませんが、fork プロパティを無効にすることで、Maven JVM から直接アプリケーションを実行することができます。そうすることは、jvmArgumentssystemPropertyVariablesenvironmentVariablesagents オプションが無視されることを意味します。

Spring Boot devtools は、Spring Boot アプリケーションで作業する際の開発時のエクスペリエンスを改善するモジュールです。有効にするには、次の依存関係をプロジェクトに追加するだけです:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

devtools が実行中の場合、アプリケーションを再コンパイルすると変更が検出され、自動的にリフレッシュされます。これはリソースだけでなくコードでも機能します。また、LiveReload サーバーも提供するため、状況が変化するたびにブラウザーのリフレッシュを自動的にトリガーできます。

Devtools は、静的リソースが変更された場合にのみブラウザーをリフレッシュするように構成することもできます(コードの変更は無視します)。プロジェクトに次のプロパティを含めるだけです。

spring.devtools.remote.restart.enabled=false

devtools より前は、プラグインはデフォルトでリソースのホットリフレッシュをサポートしていましたが、上記のソリューションを優先して無効になりました。プロジェクトを構成することにより、いつでも復元できます。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <addResources>true</addResources>
            </configuration>
        </plugin>
    </plugins>
</build>

addResources が有効になっている場合、アプリケーションを実行すると src/main/resources ディレクトリがアプリケーションのクラスパスに追加され、target/classes で見つかった重複は削除されます。これにより、Web アプリケーションの開発時に非常に役立つリソースのホットリフレッシュが可能になります。例: HTML、CSS、JavaScript ファイルで作業し、アプリケーションを再コンパイルせずに変更をすぐに確認できます。また、Java IDE をダウンロードしてインストールしなくても、フロントエンド開発者が作業できるようにするための便利な方法です。

この機能を使用する副作用は、ビルド時にリソースのフィルタリングが機能しないことです。

repackage のゴールと一致するために、run のゴールは、プラグインの構成で除外されている依存関係がクラスパスからも除外されるようにクラスパスを構築します。詳細については、専用の例を参照してください。

アプリケーションの実行時にテストの依存関係を含めると便利な場合があります。例: スタブクラスを使用するテストモードでアプリケーションを実行する場合。これを実行したい場合は、useTestClasspath パラメーターを true に設定できます。

これは、アプリケーションを実行する場合にのみ適用されます。repackage ゴールは、結果の JAR/WAR にテストの依存関係を追加しません。

7.1. spring-boot:run

org.springframework.boot:spring-boot-maven-plugin:2.6.6

アプリケーションを所定の場所で実行します。

7.1.1. 必須パラメーター

名前 タイプ デフォルト

classesDirectory

File

${project.build.outputDirectory}

7.1.2. オプションのパラメーター

名前 タイプ デフォルト

addResources

boolean

false

agents

File[]

arguments

String[]

commandlineArguments

String

directories

String[]

environmentVariables

Map

excludeGroupIds

String

excludes

List

fork

boolean

true

includes

List

jvmArguments

String

mainClass

String

noverify

boolean

optimizedLaunch

boolean

true

profiles

String[]

skip

boolean

false

systemPropertyVariables

Map

useTestClasspath

Boolean

false

workingDirectory

File

7.1.3. パラメーターの詳細

addResources

maven リソースをクラスパスに直接追加します。これにより、リソースのインプレース編集をライブで行うことができます。target/classes から重複するリソースは削除され、ClassLoader.getResources() が呼び出された場合に重複して表示されることを防ぎます。spring-boot-devtools をプロジェクトに追加することを検討してください。この機能やその他の機能を提供します。

名前

addResources

タイプ

boolean

デフォルト値

false

ユーザープロパティ

spring-boot.run.addResources

開始

1.0.0

agents

エージェント jar へのパス。注: この機能を使用するには、分岐したプロセスが必要です。

名前

agents

タイプ

java.io.File[]

デフォルト値

ユーザープロパティ

spring-boot.run.agents

開始

2.2.0

arguments

アプリケーションに渡す必要のある引数。

名前

arguments

タイプ

java.lang.String[]

デフォルト値

ユーザープロパティ

開始

1.0.0

classesDirectory

アーカイブにパッケージ化する必要があるクラスとリソースファイルを含むディレクトリ。

名前

classesDirectory

タイプ

java.io.File

デフォルト値

${project.build.outputDirectory}

ユーザープロパティ

開始

1.0.0

commandlineArguments

アプリケーションに渡す必要のあるコマンドラインからの引数。スペースを使用して複数の引数を区切り、引用符で複数の値を囲むようにしてください。指定すると、#arguments よりも優先されます。

名前

commandlineArguments

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

spring-boot.run.arguments

開始

2.2.3

directories

クラスパスに追加する必要のあるクラスディレクトリ以外の追加のディレクトリ。

名前

directories

タイプ

java.lang.String[]

デフォルト値

ユーザープロパティ

spring-boot.run.directories

開始

1.0.0

environmentVariables

アプリケーションの実行に使用される分岐プロセスに関連付けられる環境変数のリスト。注: この機能を使用するには、分岐したプロセスが必要です。

名前

environmentVariables

タイプ

java.util.Map

デフォルト値

ユーザープロパティ

開始

2.1.0

excludeGroupIds

除外する groupId 名のコンマ区切りリスト(完全一致)。

名前

excludeGroupIds

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

spring-boot.excludeGroupIds

開始

1.1.0

excludes

除外するアーティファクト定義のコレクション。Exclude 要素は、必須の groupId および artifactId プロパティと、オプションの classifier プロパティを定義します。

名前

excludes

タイプ

java.util.List

デフォルト値

ユーザープロパティ

spring-boot.excludes

開始

1.1.0

fork

実行プロセスを分岐する必要があるかどうかを示すフラグ。フォークを無効にすると、エージェント、カスタム JVM 引数、devtools、使用する作業ディレクトリの指定などの一部の機能が無効になります。

名前

fork

タイプ

boolean

デフォルト値

true

ユーザープロパティ

spring-boot.run.fork

開始

1.2.0

includes

含めるアーティファクト定義のコレクション。Include 要素は、必須の groupId および artifactId プロパティと、オプションの必須の groupId および artifactId プロパティ、およびオプションの classifier プロパティを定義します。

名前

includes

タイプ

java.util.List

デフォルト値

ユーザープロパティ

spring-boot.includes

開始

1.2.0

jvmArguments

アプリケーションの実行に使用される分岐プロセスに関連付けられる JVM 引数。コマンドラインで、引用符で複数の値を囲むようにしてください。注: この機能を使用するには、分岐したプロセスが必要です。

名前

jvmArguments

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

spring-boot.run.jvmArguments

開始

1.1.0

mainClass

メインクラスの名前。指定しない場合、"main" メソッドを含む最初に見つかったコンパイル済みクラスが使用されます。

名前

mainClass

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

spring-boot.run.main-class

開始

1.0.0

noverify

エージェントが -noverify を必要とすることを示すフラグ。

名前

noverify

タイプ

boolean

デフォルト値

ユーザープロパティ

spring-boot.run.noverify

開始

1.0.0

optimizedLaunch

JVM の起動を最適化する必要があるかどうか。

名前

optimizedLaunch

タイプ

boolean

デフォルト値

true

ユーザープロパティ

spring-boot.run.optimizedLaunch

開始

2.2.0

profiles

アクティブにする Spring プロファイル。'spring.profiles.active' 引数を指定する便利なショートカット。コマンドラインでは、コンマを使用して複数のプロファイルを区切ります。

名前

profiles

タイプ

java.lang.String[]

デフォルト値

ユーザープロパティ

spring-boot.run.profiles

開始

1.3.0

skip

実行をスキップします。

名前

skip

タイプ

boolean

デフォルト値

false

ユーザープロパティ

spring-boot.run.skip

開始

1.3.2

systemPropertyVariables

プロセスに渡す JVM システムプロパティのリスト。注: この機能を使用するには、分岐したプロセスが必要です。

名前

systemPropertyVariables

タイプ

java.util.Map

デフォルト値

ユーザープロパティ

開始

2.1.0

useTestClasspath

実行時にテストクラスパスを含めるフラグ。

名前

useTestClasspath

タイプ

java.lang.Boolean

デフォルト値

false

ユーザープロパティ

spring-boot.run.useTestClasspath

開始

1.3.0

workingDirectory

アプリケーションに使用する現在の作業ディレクトリ。指定しない場合、basedir が使用されます。注: この機能を使用するには、分岐したプロセスが必要です。

名前

workingDirectory

タイプ

java.io.File

デフォルト値

ユーザープロパティ

spring-boot.run.workingDirectory

開始

1.5.0

7.2. サンプル

7.2.1. アプリケーションをデバッグする

デフォルトでは、run ゴールは、分岐したプロセスでアプリケーションを実行します。デバッグする必要がある場合は、リモートデバッグを有効にするために必要な JVM 引数を追加する必要があります。次の構成では、デバッガーがポート 5005 で参加するまでプロセスを中断します。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <jvmArguments>
                        -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
                    </jvmArguments>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

これらの引数はコマンドラインでも指定できます。適切にラップするようにしてください。

$ mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"

7.2.2. システムプロパティの使用

システムプロパティは、systemPropertyVariables 属性を使用して指定できます。次の例では、property1 を test に、property2 を 42 に設定します。

<project>
    <build>
        <properties>
            <my.value>42</my.value>
        </properties>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <systemPropertyVariables>
                        <property1>test</property1>
                        <property2>${my.value}</property2>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

値が空であるか定義されていない場合(つまり、<my-property/>)、システムプロパティは値として空の文字列で設定されます。Maven は、pom で指定された値をトリミングするため、このメカニズムを介してスペースで開始または終了する必要がある System プロパティを指定することはできません。代わりに jvmArguments の使用を検討してください。

文字列型の Maven 変数は、システムプロパティとして渡すことができます。他の Maven 変数型(たとえば、List または URL 変数)を渡そうとすると、変数式が文字通り(未評価)渡されます。

jvmArguments パラメーターは、上記のメカニズムで定義されたシステムプロパティよりも優先されます。次の例では、property1 の値は overridden です。

$ mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dproperty1=overridden"

7.2.3. 環境変数の使用

環境変数は、environmentVariables 属性を使用して指定できます。次の例では、"ENV1"、"ENV2"、"ENV3"、"ENV4" の env 変数を設定します。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <environmentVariables>
                        <ENV1>5000</ENV1>
                        <ENV2>Some Text</ENV2>
                        <ENV3/>
                        <ENV4></ENV4>
                    </environmentVariables>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

値が空であるか定義されていない場合(つまり、<MY_ENV/>)、env 変数は値として空の文字列で設定されます。Maven は、pom で指定された値をトリミングするため、スペースで開始または終了する必要がある環境変数を指定することはできません。

文字列型の Maven 変数は、システムプロパティとして渡すことができます。他の Maven 変数型(たとえば、List または URL 変数)を渡そうとすると、変数式が文字通り(未評価)渡されます。

この方法で定義された環境変数は、既存の値よりも優先されます。

7.2.4. アプリケーション引数の使用

アプリケーションの引数は、arguments 属性を使用して指定できます。次の例では、2 つの引数 property1 および property2=42 を設定します。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <arguments>
                        <argument>property1</argument>
                        <argument>property2=${my.value}</argument>
                    </arguments>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

コマンドラインでは、引数は jvmArguments と同じようにスペースで区切られます。引数にスペースが含まれる場合は、必ず引用符で囲んでください。次の例では、2 つの引数 property1 および property2=Hello World を使用できます。

$ mvn spring-boot:run -Dspring-boot.run.arguments="property1 'property2=Hello World'"

7.2.5. アクティブなプロファイルを指定する

特定のアプリケーションに使用するアクティブなプロファイルは、profiles 引数を使用して指定できます。

次の構成により、local および dev プロファイルが有効になります。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <profiles>
                        <profile>local</profile>
                        <profile>dev</profile>
                    </profiles>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

有効にするプロファイルは、コマンドラインでも指定できます。次の例に示すように、必ずコンマで区切ります。

$ mvn spring-boot:run -Dspring-boot.run.profiles=local,dev

8. 統合テストの実行

Spring Boot アプリケーションはテスト(またはテストスイート)自体から非常に簡単に起動できますが、ビルド自体で処理することが望ましい場合があります。Spring Boot アプリケーションのライフサイクルが統合テストを中心に適切に管理されていることを確認するには、次の例に示すように、start および stop ゴールを使用できます。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>pre-integration-test</id>
                    <goals>
                        <goal>start</goal>
                    </goals>
                </execution>
                <execution>
                    <id>post-integration-test</id>
                    <goals>
                        <goal>stop</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

このようなセットアップでは、フェイルセーフプラグイン [Apache] (英語) を使用して、期待どおりに統合テストを実行できます。

デフォルトでは、アプリケーションは別のプロセスで開始され、アプリケーションとの通信には JMX が使用されます。JMX ポートを構成する必要がある場合は、専用の例を参照してください。

特定のプロパティが設定されたときに統合テストをスキップするように、より高度なセットアップを構成することもできます。専用の例を参照してください。

8.1. Spring Boot の親 POM なしでフェイルセーフを使用する

Spring Boot の親 POM である spring-boot-starter-parent は、フェイルセーフの <classesDirectory> を ${project.build.outputDirectory} に構成します。この構成がないと、Failsafe は再パッケージ化された jar ではなくコンパイルされたクラスを使用するため、Failsafe はアプリケーションのクラスをロードできません。親 POM を使用していない場合は、次の例に示すように、同じ方法でフェイルセーフを構成する必要があります。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <configuration>
        <classesDirectory>${project.build.outputDirectory}</classesDirectory>
    </configuration>
</plugin>

8.2. spring-boot:start

org.springframework.boot:spring-boot-maven-plugin:2.6.6

Spring のアプリケーションを開始します。run のゴールに反して、これはブロックせず、他のゴールがアプリケーションで動作することを許可します。このゴールは、通常、テストスイートの前にアプリケーションが開始され、その後に停止される統合テストシナリオで使用されます。

8.2.1. 必須パラメーター

名前 タイプ デフォルト

classesDirectory

File

${project.build.outputDirectory}

8.2.2. オプションのパラメーター

名前 タイプ デフォルト

addResources

boolean

false

agents

File[]

arguments

String[]

commandlineArguments

String

directories

String[]

environmentVariables

Map

excludeGroupIds

String

excludes

List

fork

boolean

true

includes

List

jmxName

String

org.springframework.boot:type=Admin,name=SpringApplication

jmxPort

int

9001

jvmArguments

String

mainClass

String

maxAttempts

int

60

noverify

boolean

profiles

String[]

skip

boolean

false

systemPropertyVariables

Map

useTestClasspath

Boolean

false

wait

long

500

workingDirectory

File

8.2.3. パラメーターの詳細

addResources

maven リソースをクラスパスに直接追加します。これにより、リソースのインプレース編集をライブで行うことができます。target/classes から重複するリソースは削除され、ClassLoader.getResources() が呼び出された場合に重複して表示されることを防ぎます。spring-boot-devtools をプロジェクトに追加することを検討してください。この機能やその他の機能を提供します。

名前

addResources

タイプ

boolean

デフォルト値

false

ユーザープロパティ

spring-boot.run.addResources

開始

1.0.0

agents

エージェント jar へのパス。注: この機能を使用するには、分岐したプロセスが必要です。

名前

agents

タイプ

java.io.File[]

デフォルト値

ユーザープロパティ

spring-boot.run.agents

開始

2.2.0

arguments

アプリケーションに渡す必要のある引数。

名前

arguments

タイプ

java.lang.String[]

デフォルト値

ユーザープロパティ

開始

1.0.0

classesDirectory

アーカイブにパッケージ化する必要があるクラスとリソースファイルを含むディレクトリ。

名前

classesDirectory

タイプ

java.io.File

デフォルト値

${project.build.outputDirectory}

ユーザープロパティ

開始

1.0.0

commandlineArguments

アプリケーションに渡す必要のあるコマンドラインからの引数。スペースを使用して複数の引数を区切り、引用符で複数の値を囲むようにしてください。指定すると、#arguments よりも優先されます。

名前

commandlineArguments

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

spring-boot.run.arguments

開始

2.2.3

directories

クラスパスに追加する必要のあるクラスディレクトリ以外の追加のディレクトリ。

名前

directories

タイプ

java.lang.String[]

デフォルト値

ユーザープロパティ

spring-boot.run.directories

開始

1.0.0

environmentVariables

アプリケーションの実行に使用される分岐プロセスに関連付けられる環境変数のリスト。注: この機能を使用するには、分岐したプロセスが必要です。

名前

environmentVariables

タイプ

java.util.Map

デフォルト値

ユーザープロパティ

開始

2.1.0

excludeGroupIds

除外する groupId 名のコンマ区切りリスト(完全一致)。

名前

excludeGroupIds

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

spring-boot.excludeGroupIds

開始

1.1.0

excludes

除外するアーティファクト定義のコレクション。Exclude 要素は、必須の groupId および artifactId プロパティと、オプションの classifier プロパティを定義します。

名前

excludes

タイプ

java.util.List

デフォルト値

ユーザープロパティ

spring-boot.excludes

開始

1.1.0

fork

実行プロセスを分岐する必要があるかどうかを示すフラグ。フォークを無効にすると、エージェント、カスタム JVM 引数、devtools、使用する作業ディレクトリの指定などの一部の機能が無効になります。

名前

fork

タイプ

boolean

デフォルト値

true

ユーザープロパティ

spring-boot.run.fork

開始

1.2.0

includes

含めるアーティファクト定義のコレクション。Include 要素は、必須の groupId および artifactId プロパティと、オプションの必須の groupId および artifactId プロパティ、およびオプションの classifier プロパティを定義します。

名前

includes

タイプ

java.util.List

デフォルト値

ユーザープロパティ

spring-boot.includes

開始

1.2.0

jmxName

spring アプリケーションのライフサイクルを管理する、自動的にデプロイされた MBean の JMX 名。

名前

jmxName

タイプ

java.lang.String

デフォルト値

org.springframework.boot:type=Admin,name=SpringApplication

ユーザープロパティ

開始

jmxPort

アプリケーションがフォークされている場合にプラットフォーム MBeanServer を公開するために使用するポート。

名前

jmxPort

タイプ

int

デフォルト値

9001

ユーザープロパティ

開始

jvmArguments

アプリケーションの実行に使用される分岐プロセスに関連付けられる JVM 引数。コマンドラインで、引用符で複数の値を囲むようにしてください。注: この機能を使用するには、分岐したプロセスが必要です。

名前

jvmArguments

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

spring-boot.run.jvmArguments

開始

1.1.0

mainClass

メインクラスの名前。指定しない場合、"main" メソッドを含む最初に見つかったコンパイル済みクラスが使用されます。

名前

mainClass

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

spring-boot.run.main-class

開始

1.0.0

maxAttempts

Spring アプリケーションの準備ができているかどうかを確認する最大試行回数。"wait" 引数と組み合わせると、グローバルタイムアウト値が得られます (デフォルトでは 30 秒)

名前

maxAttempts

タイプ

int

デフォルト値

60

ユーザープロパティ

spring-boot.start.maxAttempts

開始

noverify

エージェントが -noverify を必要とすることを示すフラグ。

名前

noverify

タイプ

boolean

デフォルト値

ユーザープロパティ

spring-boot.run.noverify

開始

1.0.0

profiles

アクティブにする Spring プロファイル。'spring.profiles.active' 引数を指定する便利なショートカット。コマンドラインでは、コンマを使用して複数のプロファイルを区切ります。

名前

profiles

タイプ

java.lang.String[]

デフォルト値

ユーザープロパティ

spring-boot.run.profiles

開始

1.3.0

skip

実行をスキップします。

名前

skip

タイプ

boolean

デフォルト値

false

ユーザープロパティ

spring-boot.run.skip

開始

1.3.2

systemPropertyVariables

プロセスに渡す JVM システムプロパティのリスト。注: この機能を使用するには、分岐したプロセスが必要です。

名前

systemPropertyVariables

タイプ

java.util.Map

デフォルト値

ユーザープロパティ

開始

2.1.0

useTestClasspath

実行時にテストクラスパスを含めるフラグ。

名前

useTestClasspath

タイプ

java.lang.Boolean

デフォルト値

false

ユーザープロパティ

spring-boot.run.useTestClasspath

開始

1.3.0

wait

Spring アプリケーションの準備ができているかどうかを確認する各試行の間に待機するミリ秒数。

名前

wait

タイプ

long

デフォルト値

500

ユーザープロパティ

spring-boot.start.wait

開始

workingDirectory

アプリケーションに使用する現在の作業ディレクトリ。指定しない場合、basedir が使用されます。注: この機能を使用するには、分岐したプロセスが必要です。

名前

workingDirectory

タイプ

java.io.File

デフォルト値

ユーザープロパティ

spring-boot.run.workingDirectory

開始

1.5.0

8.3. spring-boot:stop

org.springframework.boot:spring-boot-maven-plugin:2.6.6

「開始」ゴールによって開始されたアプリケーションを停止します。通常、テストスイートが完了すると呼び出されます。

8.3.1. オプションのパラメーター

名前 タイプ デフォルト

fork

Boolean

jmxName

String

org.springframework.boot:type=Admin,name=SpringApplication

jmxPort

int

9001

skip

boolean

false

8.3.2. パラメーターの詳細

fork

停止するプロセスが分岐したかどうかを示すフラグ。デフォルトでは、値は MavenProject から継承され、デフォルトのフォーク値(true)にフォールバックします。設定されている場合は、プロセスの StartMojo start に使用される値と一致する必要があります。

名前

fork

タイプ

java.lang.Boolean

デフォルト値

ユーザープロパティ

spring-boot.stop.fork

開始

1.3.0

jmxName

アプリケーションのライフサイクルを管理する、自動的にデプロイされた MBean の JMX 名。

名前

jmxName

タイプ

java.lang.String

デフォルト値

org.springframework.boot:type=Admin,name=SpringApplication

ユーザープロパティ

開始

jmxPort

アプリケーションがフォークされている場合にプラットフォーム MBeanServer をルックアップするために使用するポート。

名前

jmxPort

タイプ

int

デフォルト値

9001

ユーザープロパティ

開始

skip

実行をスキップします。

名前

skip

タイプ

boolean

デフォルト値

false

ユーザープロパティ

spring-boot.stop.skip

開始

1.3.2

8.4. サンプル

8.4.1. 統合テスト用のランダムポート

Spring Boot テスト統合の優れた機能の 1 つは、Web アプリケーションに空きポートを割り当てることができることです。プラグインの start ゴールが使用されると、Spring Boot アプリケーションが個別に開始され、統合テスト自体に実際のポートを渡すことが難しくなります。

以下の例は、ビルドヘルパー Maven プラグイン (英語) を使用して同じ機能を実現する方法を示しています。

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>reserve-tomcat-port</id>
                    <goals>
                        <goal>reserve-network-port</goal>
                    </goals>
                    <phase>process-resources</phase>
                    <configuration>
                        <portNames>
                            <portName>tomcat.http.port</portName>
                        </portNames>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>pre-integration-test</id>
                    <goals>
                        <goal>start</goal>
                    </goals>
                    <configuration>
                        <arguments>
                            <argument>--server.port=${tomcat.http.port}</argument>
                        </arguments>
                    </configuration>
                </execution>
                <execution>
                    <id>post-integration-test</id>
                    <goals>
                        <goal>stop</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <systemPropertyVariables>
                    <test.server.port>${tomcat.http.port}</test.server.port>
                </systemPropertyVariables>
            </configuration>
        </plugin>
    </plugins>
</build>

統合テストのいずれかで test.server.port システムプロパティを取得して、サーバーに対して適切な URL を作成できるようになりました。

8.4.2. JMX ポートをカスタマイズする

jmxPort プロパティにより、プラグインが Spring Boot アプリケーションとの通信に使用するポートをカスタマイズできます。

この例は、9001 がすでに使用されている場合にポートをカスタマイズする方法を示しています。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <jmxPort>9009</jmxPort>
            </configuration>
            <executions>
                <execution>
                    <id>pre-integration-test</id>
                    <goals>
                        <goal>start</goal>
                    </goals>
                </execution>
                <execution>
                    <id>post-integration-test</id>
                    <goals>
                        <goal>stop</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
JMX ポートを構成する必要がある場合は、上記のようにグローバル構成で構成して、両方のゴールで共有されるようにしてください。

8.4.3. 統合テストをスキップ

skip プロパティにより、Spring Boot maven プラグインの実行を完全にスキップできます。

この例は、コマンドラインプロパティを使用した統合テストをスキップし、repackage ゴールが実行されることを確認する方法を示しています。

<project>
    <properties>
        <skip.it>false</skip.it>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>pre-integration-test</id>
                        <goals>
                            <goal>start</goal>
                        </goals>
                        <configuration>
                            <skip>${skip.it}</skip>
                        </configuration>
                    </execution>
                    <execution>
                        <id>post-integration-test</id>
                        <goals>
                            <goal>stop</goal>
                        </goals>
                        <configuration>
                            <skip>${skip.it}</skip>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <configuration>
                    <skip>${skip.it}</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

デフォルトでは、統合テストが実行されますが、このセットアップにより、次のようにコマンドラインで簡単に無効化できます。

$ mvn verify -Dskip.it=true

9. アクチュエーターとの統合

Spring Boot Actuator は、META-INF/build-info.properties ファイルが存在する場合、ビルド関連情報を表示します。build-info ゴールは、プロジェクトの座標とビルド時間を含むそのようなファイルを生成します。また、次の例に示すように、任意の数の追加プロパティを追加できます。

<project>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>build-info</artifactId>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>build-info</goal>
                        </goals>
                        <configuration>
                            <additionalProperties>
                                <encoding.source>UTF-8</encoding.source>
                                <encoding.reporting>UTF-8</encoding.reporting>
                                <java.source>${maven.compiler.source}</java.source>
                                <java.target>${maven.compiler.target}</java.target>
                            </additionalProperties>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

この構成では、4 つの追加キーを使用して、予想される場所に build-info.properties が生成されます。

maven.compiler.source と maven.compiler.target は、プロジェクトで利用可能な通常のプロパティであることが期待されています。それらは期待するように補間されます。

9.1. spring-boot:build-info

org.springframework.boot:spring-boot-maven-plugin:2.6.6

現在の MavenProject の内容に基づいて build-info.properties ファイルを生成します。

9.1.1. オプションのパラメーター

名前 タイプ デフォルト

additionalProperties

Map

excludeInfoProperties

List

outputFile

File

${project.build.outputDirectory}/META-INF/build-info.properties

time

String

${project.build.outputTimestamp}

9.1.2. パラメーターの詳細

additionalProperties

build-info.properties ファイルに保存する追加のプロパティ。生成された build-info.properties では、各エントリの前に build. が付きます。

名前

additionalProperties

タイプ

java.util.Map

デフォルト値

ユーザープロパティ

開始

excludeInfoProperties

build-info.properties ファイルを除外する必要があるプロパティ。標準の groupartifactnameversion または time プロパティ、および additionalProperties からのアイテムを除外するために使用できます。

名前

excludeInfoProperties

タイプ

java.util.List

デフォルト値

ユーザープロパティ

開始

outputFile

生成された build-info.properties ファイルの場所。

名前

outputFile

タイプ

java.io.File

デフォルト値

${project.build.outputDirectory}/META-INF/build-info.properties

ユーザープロパティ

開始

time

Instant#parse(CharSequence) に適した形式で build.time プロパティに使用される値。前者が設定されていない場合、デフォルトは project.build.outputTimestamp または session.request.startTime です。build.time プロパティを完全に無効にするには、'off' を使用するか、excludeInfoProperties に追加します。

名前

time

タイプ

java.lang.String

デフォルト値

${project.build.outputTimestamp}

ユーザープロパティ

開始

2.2.0

10. ヘルプ情報

help のゴールは、プラグインの機能に関する情報を表示する標準のゴールです。

10.1. spring-boot:help

org.springframework.boot:spring-boot-maven-plugin:2.6.6

spring-boot-maven-plugin に関するヘルプ情報を表示します。mvn spring-boot:help -Ddetail=true -Dgoal=<goal-name> を呼び出して、パラメーターの詳細を表示します。

10.1.1. オプションのパラメーター

名前 タイプ デフォルト

detail

boolean

false

goal

String

indentSize

int

2

lineLength

int

80

10.1.2. パラメーターの詳細

detail

true の場合、各ゴールのすべての設定可能なプロパティを表示します。

名前

detail

タイプ

boolean

デフォルト値

false

ユーザープロパティ

detail

開始

goal

ヘルプを表示するゴールの名前。指定しない場合、すべてのゴールが表示されます。

名前

goal

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

goal

開始

indentSize

インデントレベルごとのスペースの数は、正でなければなりません。

名前

indentSize

タイプ

int

デフォルト値

2

ユーザープロパティ

indentSize

開始

lineLength

表示行の最大長は正でなければなりません。

名前

lineLength

タイプ

int

デフォルト値

80

ユーザープロパティ

lineLength

開始