嵌套 JAR
Java 没有提供任何标准方法来加载嵌套的 jar 文件(即本身包含在 jar 中的 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
目录。
可执行战争文件结构
与 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/
目录。 一个classpath.idx
file 可以为 jar 和 war 提供,它提供了将 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 仅在使用 jar 或 war 文件执行时使用类路径索引文件java -jar . 从 IDE 运行应用程序或使用 Maven 的spring-boot:run 或 Gradle 的bootRun . |
启用可重现的构建时,类路径索引文件中的条目将按字母顺序排序。 |
图层索引
图层索引文件可以在BOOT-INF/layers.idx
. 它提供了层的列表以及应包含在其中的 jar 部分。层按照应添加到 Docker/OCI 映像的顺序编写。层名称写为带引号的字符串,前缀为虚线空格 () 和冒号 ("-·"
":"
) 后缀。图层内容是文件或目录名称,以空格短划线 () 为前缀的带引号的字符串。目录名称以 结尾,文件名则不然。当使用目录名称时,这意味着该目录中的所有文件都位于同一层中。"··-·"
/
图层索引的一个典型示例是:
- "dependencies":
- "BOOT-INF/lib/dependency1.jar"
- "BOOT-INF/lib/dependency2.jar"
- "application":
- "BOOT-INF/classes/"
- "META-INF/"