跳到主要内容
版本:3.5.10

嵌套 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 文件添加到 classpath 的顺序。layers.idx 文件仅可用于 jar 文件,它允许将 jar 拆分为多个逻辑层,以便创建 Docker/OCI 镜像。

索引文件遵循 YAML 兼容的语法,以便第三方工具可以轻松解析。然而,这些文件在内部 并非 以 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"
备注

Spring Boot 仅在使用 java -jar 执行 jar 或 war 文件时才会使用 classpath 索引文件。在从 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/"