支持其他构建系统

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

Spring Boot Maven 和 Gradle 插件都使用Spring Boot加载工具真正产生罐子。 如果需要,可以直接使用这个库。spring-doc.cadn.net.cn

重新包装档案

要重新打包现有的归档,使其成为自包含的可执行归档,使用重新封装器. 这重新封装器类别会取一个指向现有罐子或战争档案的单个构造者参数。 用现有的两种工具之一repackage()用于替换原始文件或写入新目的地的方法。 在重新打包器运行前,也可以配置各种设置。spring-doc.cadn.net.cn

嵌套库

在重新打包归档时,可以通过使用图书馆接口。 我们不提供任何具体的实现图书馆这里通常是针对特定版本的系统。spring-doc.cadn.net.cn

如果你的档案库已经包含了库,你可以使用图书馆.无.spring-doc.cadn.net.cn

寻找主类

如果你不使用。Repackager.setMainClass()为了指定主类,重打包器使用 ASM 读取类文件,并尝试找到带有公共静态空缺主(String[] args)方法。 如果发现多个候选人,则会抛出例外。spring-doc.cadn.net.cn

重新打包实现示例

以下示例展示了一个典型的重打包实现: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  ...
	}

}