对于最新稳定版本,请使用 Spring Boot 4.0.4spring-doc.cadn.net.cn

嵌套的 JAR 文件

Java 没有提供任何标准方式来加载嵌套的 JAR 文件(即本身包含在另一个 JAR 文件中的 JAR 文件)。 如果你需要分发一个自包含的应用程序,并且该应用程序无需解压即可直接从命令行运行,这可能会带来问题。spring-doc.cadn.net.cn

为了解决这个问题,许多开发者使用“重定位”(shaded)的 JAR 文件。 一个重定位的 JAR 文件会将所有 JAR 中的类打包到一个单独的“超级 JAR”(uber jar)中。 重定位 JAR 的问题是,很难看出你的应用程序中实际包含了哪些库。 此外,如果多个 JAR 中使用了相同的文件名(但内容不同),也可能引发问题。 Spring Boot 采用了不同的方法,允许你直接嵌套 JAR 文件。spring-doc.cadn.net.cn

可执行 Jar 文件的结构

与 Spring Boot Loader 兼容的 JAR 文件应按以下方式组织结构:spring-doc.cadn.net.cn

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 目录中。spring-doc.cadn.net.cn

可执行的 War 文件结构

与 Spring Boot Loader 兼容的 war 文件应按以下方式组织结构:spring-doc.cadn.net.cn

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-doc.cadn.net.cn

索引文件

与 Spring Boot Loader 兼容的 JAR 和 WAR 归档文件可以在 BOOT-INF/ 目录下包含额外的索引文件。 JAR 和 WAR 文件均可提供一个 classpath.idx 文件,用于指定 JAR 文件添加到类路径中的顺序。 layers.idx 文件仅可用于 JAR 文件,它允许将 JAR 文件拆分为多个逻辑层,以便创建 Docker/OCI 镜像。spring-doc.cadn.net.cn

索引文件遵循与 YAML 兼容的语法,以便第三方工具可以轻松解析它们。 然而,这些文件在内部不会作为 YAML 进行解析,必须严格按照下述格式编写才能使用。spring-doc.cadn.net.cn

类路径索引

类路径索引文件可位于 BOOT-INF/classpath.idx 中。 通常,该文件由 Spring Boot 的 Maven 和 Gradle 构建插件自动生成。 它提供了一个 JAR 文件名(包括目录)列表,按应添加到类路径中的顺序排列。 当由构建插件生成时,此 classpath 顺序与构建系统在运行和测试应用程序时所使用的顺序一致。 每一行必须以短横线加空格("-·")开头,并且文件名必须用双引号括起来。spring-doc.cadn.net.cn

例如,给定以下 jar 包:spring-doc.cadn.net.cn

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

索引文件将如下所示:spring-doc.cadn.net.cn

- "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 镜像中的顺序进行编写。 层名称以带引号的字符串形式书写,并以短横线加空格("-·")作为前缀,冒号(":")作为后缀。 层内容为文件名或目录名,以带引号的字符串形式书写,并以两个空格、一个短横线和一个空格("··-·")作为前缀。 目录名以 / 结尾,而文件名则不以 5 结尾。 当使用目录名时,表示该目录内的所有文件都属于同一层。spring-doc.cadn.net.cn

典型的分层索引示例如下:spring-doc.cadn.net.cn

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