巢狀 JAR

Java 沒有提供任何標準方法來載入巢狀 jar 檔案 (也就是本身包含在 jar 檔案內的 jar 檔案)。如果您需要發布可以從命令列執行的獨立應用程式,而無需解壓縮,這可能會造成問題。

為了解決這個問題,許多開發人員使用「shaded」jar。shaded jar 將所有 jar 中的所有類別封裝到單個「uber jar」中。shaded jar 的問題在於,很難看出您的應用程式中實際包含哪些程式庫。如果多個 jar 中使用了相同的文件名 (但內容不同),也可能會造成問題。Spring Boot 採取了不同的方法,讓您可以直接巢狀 jar。

可執行 Jar 檔案結構

與 Spring Boot Loader 相容的 jar 檔案應以以下方式建構

example.jar
 |
 +-META-INF
 |  +-MANIFEST.MF
 +-org
 |  +-springframework
 |     +-boot
 |        +-loader
 |           +-<spring boot loader classes>
 +-BOOT-INF
    +-classes
    |  +-mycompany
    |     +-project
    |        +-YourClasses.class
    +-lib
       +-dependency1.jar
       +-dependency2.jar

應用程式類別應放置在巢狀的 BOOT-INF/classes 目錄中。依賴項應放置在巢狀的 BOOT-INF/lib 目錄中。

可執行 War 檔案結構

與 Spring Boot Loader 相容的 war 檔案應以以下方式建構

example.war
 |
 +-META-INF
 |  +-MANIFEST.MF
 +-org
 |  +-springframework
 |     +-boot
 |        +-loader
 |           +-<spring boot loader classes>
 +-WEB-INF
    +-classes
    |  +-com
    |     +-mycompany
    |        +-project
    |           +-YourClasses.class
    +-lib
    |  +-dependency1.jar
    |  +-dependency2.jar
    +-lib-provided
       +-servlet-api.jar
       +-dependency3.jar

依賴項應放置在巢狀的 WEB-INF/lib 目錄中。在嵌入式執行時需要,但在部署到傳統 Web 容器時不需要的任何依賴項,都應放置在 WEB-INF/lib-provided 中。

索引檔案

與 Spring Boot Loader 相容的 jar 和 war 歸檔可以在 BOOT-INF/ 目錄下包含額外的索引檔案。classpath.idx 檔案可以為 jar 和 war 提供,它提供了 jar 應新增至類別路徑的順序。layers.idx 檔案只能用於 jar,它允許將 jar 分割成邏輯層,以用於 Docker/OCI 映像建立。

索引檔案遵循與 YAML 相容的語法,以便第三方工具可以輕鬆解析它們。但是,這些檔案 *不會* 在內部解析為 YAML,並且必須以完全符合以下描述的格式編寫才能使用。

類別路徑索引

類別路徑索引檔案可以在 BOOT-INF/classpath.idx 中提供。通常,它是由 Spring Boot 的 Maven 和 Gradle 建置外掛程式自動產生的。它提供了 jar 名稱 (包括目錄) 的列表,以及它們應新增至類別路徑的順序。當由建置外掛程式產生時,此類別路徑順序與建置系統用於執行和測試應用程式的順序相符。每行必須以 dash space (`"-·"`) 開頭,並且名稱必須用雙引號引起來。

例如,給定以下 jar

example.jar
 |
 +-META-INF
 |  +-...
 +-BOOT-INF
    +-classes
    |  +...
    +-lib
       +-dependency1.jar
       +-dependency2.jar

索引檔案看起來會像這樣

- "BOOT-INF/lib/dependency2.jar"
- "BOOT-INF/lib/dependency1.jar"
Spring Boot 僅在使用 java -jar 執行 jar 或 war 檔案時使用類別路徑索引檔案。從 IDE 執行應用程式或使用 Maven 的 spring-boot:run 或 Gradle 的 bootRun 時,不會使用它。
啟用可重現建置時,類別路徑索引檔案中的條目會按字母順序排序。

圖層索引

圖層索引檔案可以在 BOOT-INF/layers.idx 中提供。它提供了圖層列表以及 jar 中應包含在其中的部分。圖層以應新增至 Docker/OCI 映像的順序編寫。圖層名稱以帶引號的字串編寫,並以 dash space (`"-·"`) 作為前綴,並以冒號 (`":"`) 作為後綴。圖層內容可以是檔案或目錄名稱,以帶引號的字串編寫,並以 space space dash space (`"··-·"`) 作為前綴。目錄名稱以 `/` 結尾,檔案名稱則不結尾。使用目錄名稱時,表示該目錄中的所有檔案都位於同一圖層中。

圖層索引的典型範例為

- "dependencies":
  - "BOOT-INF/lib/dependency1.jar"
  - "BOOT-INF/lib/dependency2.jar"
- "application":
  - "BOOT-INF/classes/"
  - "META-INF/"