ビルド

Spring Boot には、Maven および Gradle のビルドプラグインが含まれています。このセクションでは、これらのプラグインに関する一般的な質問に回答します。

ビルド情報を生成する

Maven プラグインと Gradle プラグインの両方で、プロジェクトの座標、名前、バージョンを含むビルド情報を生成できます。プラグインは、構成を通じて追加のプロパティを追加するように構成することもできます。このようなファイルが存在する場合、Spring Boot は BuildProperties (Javadoc) Bean を自動構成します。

Maven でビルド情報を生成するには、次の例に示すように、build-info ゴールの実行を追加します。

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<version>3.4.1</version>
			<executions>
				<execution>
					<goals>
						<goal>build-info</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>
詳細については、Spring Boot Maven プラグインのドキュメントを参照してください。

次の例は、Gradle でも同じことを行います。

springBoot {
	buildInfo()
}
詳細については、Spring Boot Gradle プラグインのドキュメントを参照してください。

Git 情報を生成する

Maven と Gradle の両方により、プロジェクトのビルド時の git ソースコードリポジトリの状態に関する情報を含む git.properties ファイルを生成できます。

Maven ユーザーの場合、spring-boot-starter-parent POM には、git.properties ファイルを生成するための事前構成済みプラグインが含まれています。これを使用するには、Git Commit Id Plugin [GitHub] (英語) の次の宣言を POM に追加します。

<build>
	<plugins>
		<plugin>
			<groupId>io.github.git-commit-id</groupId>
			<artifactId>git-commit-id-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>

Gradle ユーザーは、次の例に示すように、gradle-git-properties (英語) プラグインを使用して同じ結果を得ることができます。

plugins {
	id "com.gorylenko.gradle-git-properties" version "2.4.1"
}

Maven プラグインと Gradle プラグインはどちらも、git.properties に含まれているプロパティを構成できます。

git.properties のコミット時間は、次の形式と一致することが期待されます: yyyy-MM-dd’T’HH:mm:ssZ。これは、上記の両方のプラグインのデフォルトの形式です。この形式を使用すると、時間が Date (標準 Javadoc) に解析され、JSON に直列化されるときに、その形式が Jackson の日付直列化構成設定によって制御されるようになります。

CycloneDX SBOM を生成する

Maven と Gradle はどちらも、プロジェクトのビルド時に CycloneDX SBOM を生成できます。

Maven ユーザーの場合、spring-boot-starter-parent POM には SBOM を生成するための事前構成済みのプラグインが含まれています。これを使用するには、cyclonedx-maven-plugin [GitHub] (英語) の次の宣言を POM に追加します。

<build>
    <plugins>
        <plugin>
            <groupId>org.cyclonedx</groupId>
            <artifactId>cyclonedx-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Gradle ユーザーは、次の例に示すように、cyclonedx-gradle-plugin [GitHub] (英語) プラグインを使用して同じ結果を得ることができます。

plugins {
    id 'org.cyclonedx.bom' version '1.10.0'
}

依存関係バージョンのカスタマイズ

spring-boot-dependencies POM は、一般的な依存関係のバージョンを管理します。Maven および Gradle の Spring Boot プラグインを使用すると、これらのマネージ依存バージョンをビルドプロパティを使用してカスタマイズできます。

各 Spring Boot リリースは、この特定のサードパーティ依存関係セットに対して設計およびテストされています。バージョンを上書きすると、互換性の問題が発生する場合があります。

Maven で依存関係バージョンをオーバーライドするには、Maven プラグインのドキュメントのプラグインの使用を参照してください。

Gradle の依存関係バージョンをオーバーライドするには、Gradle プラグインのドキュメントの管理バージョンのカスタマイズを参照してください。

Maven を使用して実行可能 JAR を作成する

spring-boot-maven-plugin を使用して、実行可能な "fat " JAR を作成できます。spring-boot-starter-parent POM を使用する場合、プラグインを宣言でき、jar は次のように再パッケージ化されます。

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

親 POM を使用しない場合でも、プラグインを使用できます。ただし、次のように <executions> セクションを追加する必要があります。

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<version>3.4.1</version>
			<executions>
				<execution>
					<goals>
						<goal>repackage</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>

完全な使用箇所の詳細については、プラグインのドキュメントを参照してください。

Spring Boot アプリケーションを依存関係として使用する

war ファイルのように、Spring Boot アプリケーションは依存関係として使用されることを意図していません。アプリケーションに他のプロジェクトと共有するクラスが含まれている場合、推奨されるアプローチは、そのコードを別のモジュールに移動することです。個別のモジュールは、アプリケーションや他のプロジェクトに依存できます。

上記の推奨どおりにコードを再配置できない場合は、依存関係としての使用に適した個別のアーティファクトを生成するように Spring Boot の Maven および Gradle プラグインを構成する必要があります。実行可能ファイル jar 形式はアプリケーションクラスを BOOT-INF/classes にパッケージ化するため、実行可能ファイルアーカイブを依存関係として使用することはできません。これは、実行可能ファイル jar が依存関係として使用されている場合には見つからないことを意味します。

依存関係として使用できるアーティファクトと実行可能なアーティファクトを生成するには、分類子を指定する必要があります。この分類子は、実行可能アーカイブの名前に適用され、デフォルトのアーカイブは依存関係として使用されます。

Maven で exec の分類子を構成するには、次の構成を使用できます。

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

実行可能 Jar の実行時に特定のライブラリを抽出する

実行可能 jar のネストされたライブラリのほとんどは、実行するために解凍する必要はありません。ただし、特定のライブラリには問題がある場合があります。例: JRuby には、独自のネストされた jar サポートが含まれています。これは、jruby-complete.jar が常に独自のファイルとして直接利用可能であることを前提としています。

問題のあるライブラリを処理するために、実行可能ファイル jar が最初に実行されるときに、特定のネストされた jar が自動的に解凍されるようにフラグを立てることができます。このようなネストされた jar は、java.io.tmpdir システムプロパティによって識別される一時ディレクトリに書き込まれます。

アプリケーションの実行中に一時ディレクトリに解凍された jar ファイルが削除されないように、オペレーティングシステムが設定されていることを確認する必要があります。

例: Maven プラグインを使用して、JRuby に解凍用のフラグを設定する必要があることを示すには、次の構成を追加します。

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<requiresUnpack>
					<dependency>
						<groupId>org.jruby</groupId>
						<artifactId>jruby-complete</artifactId>
					</dependency>
				</requiresUnpack>
			</configuration>
		</plugin>
	</plugins>
</build>

除外付きの非実行可能 JAR を作成する

多くの場合、2 つの別個のビルド製品として実行可能ファイルと実行不可能な jar がある場合、実行可能バージョンにはライブラリ jar で必要のない追加の構成ファイルがあります。例: application.yaml 構成ファイルは、実行不可能な JAR から除外される場合があります。

Maven では、実行可能な jar がメインアーティファクトである必要があり、次のように、ライブラリに分類された jar を追加できます。

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
		<plugin>
			<artifactId>maven-jar-plugin</artifactId>
			<executions>
				<execution>
					<id>lib</id>
					<phase>package</phase>
					<goals>
						<goal>jar</goal>
					</goals>
					<configuration>
						<classifier>lib</classifier>
						<excludes>
							<exclude>application.yaml</exclude>
						</excludes>
					</configuration>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>

リモート Maven で開始した Spring Boot アプリケーションのデバッグ

Maven で起動された Spring Boot アプリケーションに リモートデバッガーをアタッチするには、maven プラグインの jvmArguments プロパティを使用できます。

詳細については、この例を参照してください。

spring-boot-antlib を使用せずに Ant から実行可能アーカイブを構築する

Ant でビルドするには、依存関係を取得してコンパイルし、jar または war アーカイブを作成する必要があります。実行可能にするには、spring-boot-antlib モジュールを使用するか、次の手順に従います。

  1. jar を構築している場合、ネストされた BOOT-INF/classes ディレクトリにアプリケーションのクラスとリソースをパッケージ化します。war を構築する場合は、通常どおり、ネストされた WEB-INF/classes ディレクトリにアプリケーションのクラスをパッケージ化します。

  2. jar のネストされた BOOT-INF/lib ディレクトリまたは war の WEB-INF/lib にランタイム依存関係を追加します。アーカイブ内のエントリを圧縮しないでください。

  3. jar の場合はネストされた BOOT-INF/lib ディレクトリに、war の場合は WEB-INF/lib-provided に、provided (組み込みコンテナー)依存関係を追加します。アーカイブ内のエントリを圧縮しないでください。

  4. spring-boot-loader クラスをアーカイブのルートに追加します(Main-Class が利用できるように)。

  5. 適切なランチャー (jar ファイルの場合は JarLauncher (Javadoc) など) をマニフェストの Main-Class 属性として使用し、必要なその他のプロパティをマニフェストエントリとして指定します (主に、Start-Class プロパティを設定します)。

次の例は、Ant を使用して実行可能アーカイブを構築する方法を示しています。

<target name="build" depends="compile">
	<jar destfile="target/${ant.project.name}-${spring-boot.version}.jar" compress="false">
		<mappedresources>
			<fileset dir="target/classes" />
			<globmapper from="*" to="BOOT-INF/classes/*"/>
		</mappedresources>
		<mappedresources>
			<fileset dir="src/main/resources" erroronmissingdir="false"/>
			<globmapper from="*" to="BOOT-INF/classes/*"/>
		</mappedresources>
		<mappedresources>
			<fileset dir="${lib.dir}/runtime" />
			<globmapper from="*" to="BOOT-INF/lib/*"/>
		</mappedresources>
		<zipfileset src="${lib.dir}/loader/spring-boot-loader-jar-${spring-boot.version}.jar" />
		<manifest>
			<attribute name="Main-Class" value="org.springframework.boot.loader.launch.JarLauncher" />
			<attribute name="Start-Class" value="${start-class}" />
		</manifest>
	</jar>
</target>