Nested JARs

Java 并不提供任何加载嵌套 jar 文件(即,自身包含在 jar 中的 jar 文件)的标准方法。如果您需要分发可以从命令行运行而无需解压缩的自包含应用程序,那么这可能会带来问题。 为了解决这个问题,许多开发者使用 “shaded” jar。一个 shaded jar 将来自所有 jar 的所有类打包到单个 “uber jar” 中。shaded jar 的问题在于很难看出应用程序中到底包含哪些库。如果在多个 jar 中使用了相同的文件名(但具有不同的内容),也可能会带来问题。Spring Boot 采用了不同的方法,并允许您直接嵌套 jar。

The Executable Jar File Structure

与 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 目录中。

The Executable War File Structure

与 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 中。

Index Files

与 Spring Boot Loader 兼容的 jar 和 war 档案可以在 BOOT-INF/ 目录下包含其他 index 文件。对于 jar 和 war,都可以提供 classpath.idx 文件,它提供了将 jar 添加到类路径中的顺序。layers.idx 文件仅可用于 jar,它允许将 jar 拆分为逻辑层,以便创建 Docker/OCI 映像。

索引文件遵循与 YAML 兼容的语法,以便第三方工具可以轻松地解析它们。然而,这些文件在内部被 not 解析为 YAML,并且它们必须严格按照以下所述的格式编写才能使用。

Classpath Index

可以在 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"

Layer Index

可以在 BOOT-INF/layers.idx 中提供图层索引文件。它提供了图层的列表以及应包含在其中的 jar 部分。图层按应添加到 Docker/OCI 映像中的顺序编写。图层名称写为以连字符空格 ("-·“) and with a colon (”:") 为前缀且后缀为引号的字符串。图层内容是文件或目录名称,由以空格空格连字符空格 ("··-·") 为前缀的引号字符串编写。目录名称以 / 结尾,文件名则没有。当使用目录名称时,这意味着该目录内所有文件都在同一层中。

一个图层索引的典型示例如下:

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