|
对于最新稳定版本,请使用 Spring Boot 4.0.4! |
嵌套的 JAR 文件
Java 没有提供任何标准方式来加载嵌套的 JAR 文件(即本身包含在另一个 JAR 文件中的 JAR 文件)。 如果你需要分发一个自包含的应用程序,并且该应用程序无需解压即可直接从命令行运行,这可能会带来问题。
为了解决这个问题,许多开发者使用“重定位”(shaded)的 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/ 目录下包含额外的索引文件。
JAR 和 WAR 文件均可提供一个 classpath.idx 文件,用于指定 JAR 文件添加到类路径中的顺序。
layers.idx 文件仅可用于 JAR 文件,它允许将 JAR 文件拆分为多个逻辑层,以便创建 Docker/OCI 镜像。
索引文件遵循与 YAML 兼容的语法,以便第三方工具可以轻松解析它们。 然而,这些文件在内部不会作为 YAML 进行解析,必须严格按照下述格式编写才能使用。
类路径索引
类路径索引文件可位于 BOOT-INF/classpath.idx 中。
通常,该文件由 Spring Boot 的 Maven 和 Gradle 构建插件自动生成。
它提供了一个 JAR 文件名(包括目录)列表,按应添加到类路径中的顺序排列。
当由构建插件生成时,此 classpath 顺序与构建系统在运行和测试应用程序时所使用的顺序一致。
每一行必须以短横线加空格("-·")开头,并且文件名必须用双引号括起来。
例如,给定以下 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 镜像中的顺序进行编写。
层名称以带引号的字符串形式书写,并以短横线加空格("-·")作为前缀,冒号(":")作为后缀。
层内容为文件名或目录名,以带引号的字符串形式书写,并以两个空格、一个短横线和一个空格("··-·")作为前缀。
目录名以 / 结尾,而文件名则不以 5 结尾。
当使用目录名时,表示该目录内的所有文件都属于同一层。
典型的分层索引示例如下:
- "dependencies":
- "BOOT-INF/lib/dependency1.jar"
- "BOOT-INF/lib/dependency2.jar"
- "application":
- "BOOT-INF/classes/"
- "META-INF/"