巢狀 JARs

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/ 目錄下包含額外的索引檔案。jar 和 war 檔案都可以提供 classpath.idx 檔案,它提供了 jar 應新增到 classpath 的順序。layers.idx 檔案只能用於 jar,它允許將 jar 拆分為邏輯層,以便建立 Docker/OCI 映象。

索引檔案遵循 YAML 相容的語法,以便第三方工具可以輕鬆解析它們。然而,這些檔案在內部 不會 被解析為 YAML,並且必須嚴格按照下面描述的格式編寫才能使用。

Classpath 索引

Classpath 索引檔案可以在 BOOT-INF/classpath.idx 中提供。通常,它由 Spring Boot 的 Maven 和 Gradle 構建外掛自動生成。它提供了一個 jar 檔名(包括目錄)列表,按它們應新增到 classpath 的順序排列。當由構建外掛生成時,此 classpath 順序與構建系統用於執行和測試應用程式的順序一致。每行必須以破折號空格("-·")開頭,名稱必須用雙引號括起來。

例如,給定以下 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 檔案時使用 classpath 索引檔案。從 IDE 執行應用程式時或使用 Maven 的 spring-boot:run 或 Gradle 的 bootRun 時不使用它。
啟用可重現構建時,classpath 索引檔案中的條目按字母順序排序。

層索引

層索引檔案可以在 BOOT-INF/layers.idx 中提供。它提供了一個層列表以及每個層應包含的 jar 部分。層按照它們應新增到 Docker/OCI 映象的順序編寫。層名稱寫成帶引號的字串,字首為破折號空格("-·"),字尾為冒號(":")。層內容是檔案或目錄名,寫成帶引號的字串,字首為兩個空格加破折號空格("··-·")。目錄名以 / 結尾,檔名則不以 / 結尾。當使用目錄名時,意味著該目錄內的所有檔案都在同一層。

層索引的典型示例如下

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