支援其他建置系統
如果您想要使用 Maven、Gradle 或 Ant 以外的建置工具,您可能需要開發自己的外掛程式。可執行 jar 檔需要遵循特定格式,並且某些條目需要以未壓縮形式寫入 (詳細資訊請參閱附錄中的可執行 jar 格式章節)。
Spring Boot Maven 和 Gradle 外掛程式都使用 spring-boot-loader-tools
來實際產生 jar 檔。如果需要,您可以直接使用這個程式庫。
重新封裝歸檔
若要重新封裝現有的歸檔,使其成為獨立的可執行歸檔,請使用 org.springframework.boot.loader.tools.Repackager
。Repackager
類別採用單一建構子引數,該引數指向現有的 jar 或 war 歸檔。使用兩個可用的 repackage()
方法之一,以取代原始檔案或寫入新的目的地。在執行 repackager 之前,也可以在其上設定各種設定。
巢狀程式庫
重新封裝歸檔時,您可以使用 org.springframework.boot.loader.tools.Libraries
介面來包含對依賴檔案的參考。我們在此不提供 Libraries
的任何具體實作,因為它們通常是建置系統特定的。
如果您的歸檔已包含程式庫,則可以使用 Libraries.NONE
。
尋找主類別
如果您未使用 Repackager.setMainClass()
來指定主類別,則 repackager 會使用 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 ...
}
}