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

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

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

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

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

ネストされたライブラリ

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

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

メインクラスを見つける

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

再パッケージの実装例

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

  • Java

  • Kotlin

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.springframework.boot.loader.tools.Library;
import org.springframework.boot.loader.tools.LibraryCallback;
import org.springframework.boot.loader.tools.LibraryScope;
import org.springframework.boot.loader.tools.Repackager;

public class MyBuildTool {

	public void build() throws IOException {
		File sourceJarFile = ...
		Repackager repackager = new Repackager(sourceJarFile);
		repackager.setBackupSource(false);
		repackager.repackage(this::getLibraries);
	}

	private void getLibraries(LibraryCallback callback) throws IOException {
		// Build system specific implementation, callback for each dependency
		for (File nestedJar : getCompileScopeJars()) {
			callback.library(new Library(nestedJar, LibraryScope.COMPILE));
		}
		// ...
	}

	private List<File> getCompileScopeJars() {
		return ...
	}

}
import org.springframework.boot.loader.tools.Library
import org.springframework.boot.loader.tools.LibraryCallback
import org.springframework.boot.loader.tools.LibraryScope
import org.springframework.boot.loader.tools.Repackager
import java.io.File
import java.io.IOException

class MyBuildTool {

	@Throws(IOException::class)
	fun build() {
		val sourceJarFile: File? =  ...
		val repackager = Repackager(sourceJarFile)
		repackager.setBackupSource(false)
		repackager.repackage { callback: LibraryCallback -> getLibraries(callback) }
	}

	@Throws(IOException::class)
	private fun getLibraries(callback: LibraryCallback) {
		// Build system specific implementation, callback for each dependency
		for (nestedJar in getCompileScopeJars()!!) {
			callback.library(Library(nestedJar, LibraryScope.COMPILE))
		}
		// ...
	}

	private fun getCompileScopeJars(): List<File?>? {
		return  ...
	}

}