巢狀 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/"