支援其他構建系統

如果您想使用 Maven、Gradle 或 Ant 之外的構建工具,您可能需要開發自己的外掛。可執行 jar 需要遵循特定格式,並且某些條目需要以未壓縮的形式寫入(詳情請參見附錄中的可執行 jar 格式一節)。

Spring Boot 的 Maven 和 Gradle 外掛都使用 spring-boot-loader-tools 庫來實際生成 jar。如果需要,您可以直接使用此庫。

重新打包歸檔

要將現有歸檔重新打包成一個自包含的可執行歸檔,請使用 RepackagerRepackager 類接受一個建構函式引數,該引數指向現有的 jar 或 war 歸檔。使用兩個可用的 repackage() 方法之一來替換原始檔案或寫入新目標位置。在執行 repackager 之前,還可以配置各種設定。

巢狀庫

重新打包歸檔時,您可以使用 Libraries 介面來包含對依賴檔案的引用。由於具體的實現通常取決於構建系統,我們在此不提供 Libraries 的具體實現。

如果您的歸檔已經包含庫,您可以使用 Libraries.NONE

查詢主類

如果您不使用 Repackager.setMainClass() 來指定主類,repackager 會使用 ASM 讀取類檔案並嘗試查詢具有 public static void main(String[] args) 方法的合適類。如果找到多個候選類,則會丟擲異常。

Repackage 實現示例

以下示例展示了一個典型的 repackage 實現

  • 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  ...
	}

}