巢狀 JAR

Java 不提供任何標準方式來載入巢狀的 jar 檔案(即,本身包含在 jar 中的 jar 檔案)。如果你需要分發一個可以從命令列執行而無需解壓的自包含應用程式,這可能會帶來問題。

為了解決這個問題,許多開發者使用“著色(shaded)”jar。著色 jar 將所有 jar 中的所有類打包成一個單獨的“uber jar”。著色 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 應新增到類路徑中的順序。layers.idx 檔案只能用於 jar,它允許將 jar 分割成邏輯層,以便建立 Docker/OCI 映象。

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

類路徑索引

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

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

層索引

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

層索引的典型示例如下:

- "dependencies":
  - "BOOT-INF/lib/dependency1.jar"
  - "BOOT-INF/lib/dependency2.jar"
- "application":
  - "BOOT-INF/classes/"
  - "META-INF/"
© . This site is unofficial and not affiliated with VMware.