嵌套 JAR

Java 不提供任何标准方法来加载嵌套的 jar 文件(即,本身包含在 jar 中的 jar 文件)。 如果您需要分发一个无需解压缩即可从命令行运行的独立应用程序,这可能会出现问题。spring-doc.cn

为了解决这个问题,许多开发人员使用“阴影”jar。 阴影 jar 将所有 jar 中的所有类打包到一个 “uber jar” 中。 着色 jar 的问题在于,很难看到您的应用程序中实际存在哪些库。 如果在多个 jar 中使用相同的文件名(但内容不同),也可能出现问题。 Spring Boot 采用不同的方法,让您实际上直接嵌套 jar。spring-doc.cn

可执行 jar 文件结构

与 Spring Boot Loader 兼容的 jar 文件应按以下方式构建:spring-doc.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/classesBOOT-INF/libspring-doc.cn

可执行的 war 文件结构

与 Spring Boot Loader 兼容的 war 文件应按以下方式构建:spring-doc.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 容器时不需要的任何依赖项都应放在 .WEB-INF/libWEB-INF/lib-providedspring-doc.cn

索引文件

与 Spring Boot Loader 兼容的 jar 和 war 存档可以在目录下包含其他索引文件。 可以为 jar 和 war 提供一个文件,它提供了应将 jar 添加到 Classpath 的顺序。 该文件只能用于 jar,并且允许将 jar 拆分为逻辑层以创建 Docker/OCI 映像。BOOT-INF/classpath.idxlayers.idxspring-doc.cn

索引文件遵循 YAML 兼容语法,因此第三方工具可以轻松解析它们。 但是,这些文件在内部不会解析为 YAML,它们必须以下面描述的格式编写才能使用。spring-doc.cn

Classpath Index(类路径索引)

类路径索引文件可以在 中提供。 通常,它是由 Spring Boot 的 Maven 和 Gradle 构建插件自动生成的。 它提供了一个 jar 名称(包括目录)的列表,其顺序是它们应该添加到 Classpath 中的顺序。 当由 build 插件生成时,此 classpath 排序与 build system 用于运行和测试应用程序的 classpath 排序匹配。 每行必须以破折号 () 开头,名称必须用双引号括起来。BOOT-INF/classpath.idx"-·"spring-doc.cn

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

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

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

- "BOOT-INF/lib/dependency2.jar"
- "BOOT-INF/lib/dependency1.jar"
Spring Boot 仅在使用 jar 或 war 文件执行时使用 classpath 索引文件。 从 IDE 运行应用程序或使用 Maven 或 Gradle 的 .java -jarspring-boot:runbootRun
启用可重现构建时,类路径索引文件中的条目将按字母顺序排序。

图层索引

层索引文件可以在 中提供。 它提供了一个层列表以及应包含在其中的 jar 部分。 层按照应添加到 Docker/OCI 映像的顺序写入。 图层名称写为带引号的字符串,前缀为破折号 () 和冒号 () 后缀。 图层内容是文件或目录名称,以带引号的字符串编写,前缀为 space、space、dash space、() 。 目录名称以 结尾,文件名则不以 . 结尾。 使用目录名称时,表示该目录内的所有文件都位于同一层中。BOOT-INF/layers.idx"-·"":""··-·"/spring-doc.cn

层索引的一个典型示例是:spring-doc.cn

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