跳到主要内容
版本:4.0.2

嵌套 JAR

QWen Max 中英对照 Nested JARs

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

为了解决这个问题,许多开发者使用“shaded” jar。一个 shaded jar 会将所有 jar 中的所有类打包到一个单一的“uber jar”中。shaded 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 文件名(包括目录)。当由构建插件生成时,此类路径顺序与构建系统用于运行和测试应用程序时使用的顺序一致。每行必须以连字符加空格("- ")开头,且文件名必须用双引号括起来。

例如,给定以下 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 时,不会使用该文件。

备注

启用可重现构建时,类路径索引文件中的条目将按字母顺序排序。

Layer Index

BOOT-INF/layers.idx 中可以提供层索引文件。该文件列出了各层以及 JAR 文件中应包含在这些层中的部分。层按照其应添加到 Docker/OCI 镜像中的顺序写入。层名称以带引号的字符串形式书写,前缀为破折号加空格("- "),后缀为冒号(":")。层内容为文件或目录名,以带引号的字符串形式书写,前缀为两个空格加破折号加空格(" - ")。目录名以 / 结尾,文件名则不以 / 结尾。当使用目录名时,表示该目录内的所有文件都属于同一层。

一个典型的 layers 索引示例为:

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