支援其他構建系統
如果您想使用 Maven、Gradle 或 Ant 以外的構建工具,您可能需要開發自己的外掛。可執行 jar 需要遵循特定的格式,並且某些條目需要以未壓縮的形式寫入(有關詳細資訊,請參閱附錄中的可執行 jar 格式部分)。
Spring Boot Maven 和 Gradle 外掛都利用 spring-boot-loader-tools 來實際生成 jar。如果需要,您可以直接使用此庫。
重新打包歸檔檔案
要重新打包現有歸檔檔案,使其成為獨立的自包含可執行歸檔檔案,請使用 Repackager。Repackager 類接受一個建構函式引數,該引數引用一個現有的 jar 或 war 歸檔檔案。使用兩個可用的 repackage() 方法之一來替換原始檔案或寫入新目標。在執行之前,還可以在重新打包器上配置各種設定。
巢狀庫
如果您的歸檔檔案已包含庫,您可以使用 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 ...
}
}