嵌套 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
可执行的 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 容器时不需要的任何依赖项都应放在 .WEB-INF/lib
WEB-INF/lib-provided
索引文件
与 Spring Boot Loader 兼容的 jar 和 war 存档可以在目录下包含其他索引文件。
可以为 jar 和 war 提供一个文件,它提供了应将 jar 添加到 Classpath 的顺序。
该文件只能用于 jar,并且允许将 jar 拆分为逻辑层以创建 Docker/OCI 映像。BOOT-INF/
classpath.idx
layers.idx
索引文件遵循 YAML 兼容语法,因此第三方工具可以轻松解析它们。 但是,这些文件在内部不会解析为 YAML,它们必须以下面描述的格式编写才能使用。
Classpath Index(类路径索引)
类路径索引文件可以在 中提供。
通常,它是由 Spring Boot 的 Maven 和 Gradle 构建插件自动生成的。
它提供了一个 jar 名称(包括目录)的列表,其顺序是它们应该添加到 Classpath 中的顺序。
当由 build 插件生成时,此 classpath 排序与 build system 用于运行和测试应用程序的 classpath 排序匹配。
每行必须以破折号 () 开头,名称必须用双引号括起来。BOOT-INF/classpath.idx
"-·"
例如,给定以下 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 文件执行时使用 classpath 索引文件。
从 IDE 运行应用程序或使用 Maven 或 Gradle 的 .java -jar spring-boot:run bootRun |
启用可重现构建时,类路径索引文件中的条目将按字母顺序排序。 |
图层索引
层索引文件可以在 中提供。
它提供了一个层列表以及应包含在其中的 jar 部分。
层按照应添加到 Docker/OCI 映像的顺序写入。
图层名称写为带引号的字符串,前缀为破折号 () 和冒号 () 后缀。
图层内容是文件或目录名称,以带引号的字符串编写,前缀为 space、space、dash space、() 。
目录名称以 结尾,文件名则不以 . 结尾。
使用目录名称时,表示该目录内的所有文件都位于同一层中。BOOT-INF/layers.idx
"-·"
":"
"··-·"
/
层索引的一个典型示例是:
- "dependencies":
- "BOOT-INF/lib/dependency1.jar"
- "BOOT-INF/lib/dependency2.jar"
- "application":
- "BOOT-INF/classes/"
- "META-INF/"