支持其他构建系统
如果您想使用 Maven、Gradle 或 Ant 之外的构建工具,您可能需要开发自己的插件。可执行 JAR 需要遵循特定的格式,并且某些条目需要以未压缩的形式写入(有关详细信息,请参阅附录中的可执行 JAR 格式部分)。
Spring Boot Maven 和 Gradle 插件都使用spring-boot-loader-tools
来实际生成 JAR。如有需要,您可以直接使用此库。
重新打包归档文件
要重新打包现有归档文件使其成为一个自包含的可执行归档文件,请使用org.springframework.boot.loader.tools.Repackager
。Repackager
类接受一个构造函数参数,该参数引用现有的jar或war归档文件。使用两个可用的repackage()
方法之一,可以替换原始文件或写入新目标位置。在运行之前,还可以配置重新打包程序的各种设置。
嵌套库
重新打包归档文件时,可以使用org.springframework.boot.loader.tools.Libraries
接口包含对依赖文件的引用。我们在这里不提供Libraries
的任何具体实现,因为它们通常是特定于构建系统的。
如果您的归档文件已包含库,则可以使用Libraries.NONE
。
查找主类
如果不使用Repackager.setMainClass()
指定主类,则重新打包程序将使用ASM读取类文件,并尝试查找具有public static void main(String[] args)
方法的合适的类。如果找到多个候选类,则会抛出异常。
重新打包实现示例
以下示例显示了一个典型的重新打包实现
-
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 ...
}
}