嵌套 JAR 文件

Java 没有提供任何标准方法来加载嵌套 jar 文件(即,自身包含在 jar 文件中的 jar 文件)。如果你需要分发一个自包含的应用程序,可以在命令行运行而无需解压,这可能会成为问题。

为了解决这个问题,许多开发者使用“阴影”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/目录下包含其他索引文件。classpath.idx文件可用于 jar 和 war 文件,它提供应将 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"
只有当使用java -jar执行 jar 或 war 文件时,Spring Boot 才使用类路径索引文件。在从 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/"