嵌套JARs
Java 没有提供任何标准方式来加载嵌套的 jar 文件(即本身包含在 jar 中的 jar 文件)。 如果你需要分发一个可以从命令行运行而无需解压的自包含应用,这可能会带来问题。
为了解决这个问题,许多开发者使用“着色”罐子。 阴影罐子将所有类别,所有罐子的集合,打包到一个“超罐子”中。 阴影jar的问题在于很难看清实际应用里有哪些库。 如果同一个文件名(但内容不同)在多个jar中使用,也会带来问题。 Spring Boot 采取了不同的方法,允许你直接嵌套罐子。
可执行 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
应用类应置入嵌套启动-INF/类目录。
依赖应放在嵌套中启动-INF/LIB目录。
可执行战争文件结构
兼容 Spring Boot Loader 的战争文件应按以下结构排列:
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-提供的.
索引文件
兼容 Spring Boot Loader 的 jar 和 war 归档可以在启动步兵/目录。
一个classpath.idx文件可以同时用于 jar 和 wars,并提供了将 jar 添加到类路径的顺序。
这layers.idx文件只能用于 jar,并且允许将 jar 拆分为逻辑层,用于 Docker 或 OCI 图像创建。
索引文件遵循兼容 YAML 的语法,便于被第三方工具轻松解析。 然而,这些文件内部并未解析为YAML格式,必须按照下文描述的格式编写才能使用。
类路径索引
类路径索引文件可以提供在BOOT-INF/classpath.idx.
通常,它由 Spring Boot 的 Maven 和 Gradle 构建插件自动生成。
它提供了 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 index 文件Java -jar.
在从 IDE 运行应用或使用 Maven 时,不会使用Spring Boot:跑或者Gradle的启动运行. |
| 启用可重现构建时,类路径索引文件中的条目按字母顺序排序。 |
层指数
图层索引文件可以提供于BOOT-INF/layers.idx.
它列出了层数以及罐子中应包含的部分。
图层的编写顺序是按照添加到 Docker/OCI 镜像的顺序。
图层名称以引号字符串形式表示,前置破折号()并加冒号("-·"":")后缀。
层内容可以是文件名或目录名,以引号字符串写成,前缀为空格、空间、破折号、空格()。
目录名以 结尾,文件名则不以 结尾。
当使用目录名称时,意味着该目录内的所有文件都在同一层。"··-·"/
图层索引的典型例子是:
- "dependencies":
- "BOOT-INF/lib/dependency1.jar"
- "BOOT-INF/lib/dependency2.jar"
- "application":
- "BOOT-INF/classes/"
- "META-INF/"