如果您想使用 Maven、Gradle 或 Ant 以外的构建工具,您可能需要开发自己的插件。 可执行 jar 需要遵循特定的格式,并且某些条目需要以未压缩的形式编写(有关详细信息,请参阅附录中的“可执行 jar 格式”部分)。Spring中文文档

Spring Boot Maven 和 Gradle 插件都用于实际生成 jar。 如果需要,您可以直接使用此库。spring-boot-loader-toolsSpring中文文档

重新包装档案

要重新打包现有存档,使其成为独立的可执行存档,请使用 。 该类采用引用现有 jar 或战争存档的单个构造函数参数。 使用两种可用方法之一替换原始文件或写入新目标。 在重新打包程序运行之前,还可以在重新打包程序上配置各种设置。org.springframework.boot.loader.tools.RepackagerRepackagerrepackage()Spring中文文档

嵌套库

重新打包存档时,可以使用接口包含对依赖项文件的引用。 我们这里没有提供任何具体的实现,因为它们通常是特定于构建系统的。org.springframework.boot.loader.tools.LibrariesLibrariesSpring中文文档

如果您的存档已包含库,则可以使用 .Libraries.NONESpring中文文档

查找主类

如果不用于指定主类,则重新打包程序将使用 ASM 读取类文件,并尝试使用方法查找合适的类。 如果找到多个候选者,则会引发异常。Repackager.setMainClass()public static void main(String[] args)Spring中文文档

重新打包实现示例

以下示例显示了一个典型的重新打包实现:Spring中文文档

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

}