跳到主要内容
版本:3.5.10

支持其他构建系统

QWen Max 中英对照 Supporting Other Build Systems

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

Spring Boot 的 Maven 和 Gradle 插件都使用 spring-boot-loader-tools 来实际生成 JAR 文件。如果需要,你可以直接使用这个库。

重新打包归档文件

要将现有的归档文件重新打包为自包含的可执行归档文件,请使用 RepackagerRepackager 类的构造函数接受一个参数,该参数指向一个现有的 jar 或 war 归档文件。可以使用两个可用的 repackage() 方法之一,以替换原始文件或将结果写入新的目标位置。在运行 repackager 之前,还可以对其配置各种设置。

嵌套库

在重新打包归档文件时,你可以通过使用 Libraries 接口来包含对依赖文件的引用。我们在此不提供 Libraries 的任何具体实现,因为它们通常与构建系统相关。

如果你的归档文件已经包含依赖库,你可以使用 Libraries.NONE

查找主类

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

示例重新打包实现

以下示例展示了一个典型的 repackage 实现:

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

}