此版本仍在开发中,尚未视为稳定版。如需最新稳定版本,请使用 Spring Boot 4.0.4spring-doc.cadn.net.cn

支持其他构建系统

如果你想使用除 Maven、Gradle 或 Ant 之外的构建工具,很可能需要自行开发插件。 可执行 JAR 文件需要遵循特定的格式,并且某些条目必须以未压缩的形式写入(详见附录中的可执行 JAR 格式部分)。spring-doc.cadn.net.cn

Spring Boot 的 Maven 和 Gradle 插件都使用 spring-boot-loader-tools 来实际生成 JAR 文件。 如有需要,您可以直接使用此库。spring-doc.cadn.net.cn

重新打包归档文件

要将现有存档重新打包为自包含的可执行存档,请使用 RepackagerRepackager 类接受一个构造函数参数,该参数引用现有的 jar 或 war 存档。 使用两个可用的 repackage() 方法之一来替换原始文件或写入新目标。 在运行重新打包器之前,还可以配置各种设置。spring-doc.cadn.net.cn

嵌套库

在重新打包归档文件时,您可以通过使用 Libraries 接口来包含对依赖文件的引用。 我们在此不提供 Libraries 的任何具体实现,因为它们通常是特定于构建系统的。spring-doc.cadn.net.cn

如果您的归档已经包含库,您可以使用 Libraries.NONEspring-doc.cadn.net.cn

查找主类

如果你没有使用 Repackager.setMainClass() 来指定主类,repackager 会使用 ASM 读取类文件,并尝试查找一个包含 public static void main(String[] args) 方法的合适类。 如果找到多个候选类,则会抛出异常。spring-doc.cadn.net.cn

示例重新打包实现

以下示例展示了一个典型的重新打包(repackage)实现:spring-doc.cadn.net.cn

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

}