Java 不提供任何标准方法来加载嵌套的 jar 文件(即,本身包含在 jar 中的 jar 文件)。如果您需要分发可以从命令行运行而无需解包的独立应用程序,这可能会出现问题。
为了解决这个问题,许多开发人员使用“阴影”罐子。带阴影的 jar 将所有 jar 中的所有类打包到一个“uber jar”中。带阴影的 jar 的问题是很难看出哪些库实际上在您的应用程序中。如果在多个 jar 中使用相同的文件名(但内容不同),也可能会出现问题。Spring Boot 采用了不同的方法,让您实际上可以直接嵌套 jar。
1.1。可执行 Jar 文件结构
Spring Boot Loader 兼容的 jar 文件应按以下方式构造:
例子.jar
|
+-元信息
| +-清单.MF
+-组织
| +-springframework
| +-启动
| +-装载机
| +-
+-引导-INF
+-类
| +-我的公司
| +-项目
| +-YourClasses.class
+-lib
+-dependency1.jar
+-dependency2.jar
应用程序类应放置在嵌套BOOT-INF/classes目录中。依赖项应放置在嵌套BOOT-INF/lib目录中。
1.2. 可执行的战争文件结构
与 Spring Boot Loader 兼容的 war 文件应按以下方式构建:
例子.war
|
+-元信息
| +-清单.MF
+-组织
| +-springframework
| +-启动
| +-装载机
| +-
+-WEB-INF
+-类
| +-com
| +-我的公司
| +-项目
| +-YourClasses.class
+-lib
| +-dependency1.jar
| +-dependency2.jar
+-lib-提供
+-servlet-api.jar
+-dependency3.jar
依赖项应放置在嵌套WEB-INF/lib目录中。运行嵌入式时需要但部署到传统 Web 容器时不需要的任何依赖项都应放在WEB-INF/lib-provided.
1.3. 索引文件
Spring Boot Loader 兼容的 jar 和 war 档案可以在BOOT-INF/目录下包含其他索引文件。classpath.idx可以为 jars 和 wars 提供一个文件,它提供了将 jars 添加到类路径的顺序。该layers.idx文件只能用于 jar,它允许将 jar 拆分为逻辑层以创建 Docker/OCI 映像。
索引文件遵循与 YAML 兼容的语法,因此它们可以很容易地被第三方工具解析。但是,这些文件不会在内部被解析为 YAML,它们必须完全按照下面描述的格式编写才能使用。
1.4. 类路径索引
类路径索引文件可以在BOOT-INF/classpath.idx. 它提供了一个 jar 名称列表(包括目录),按照它们应该添加到类路径的顺序。每行必须以破折号空格 ( "-·") 开头,并且名称必须用双引号括起来。
例如,给定以下 jar:
例子.jar
|
+-元信息
| +-...
+-引导-INF
+-类
| +...
+-lib
+-dependency1.jar
+-dependency2.jar
索引文件如下所示:
-“引导-INF/lib/dependency2.jar”
-“引导-INF/lib/dependency1.jar”
1.5。图层索引
图层索引文件可以在BOOT-INF/layers.idx. 它提供了层列表和应包含在其中的 jar 的部分。层是按照它们应该添加到 Docker/OCI 映像的顺序编写的。层名称写为带引号的字符串,前缀为破折号空格 ( "-·") 和冒号 ( ":") 后缀。层内容是文件或目录名称,以空格、破折号空格 ( "··-·") 为前缀的带引号的字符串编写。目录名以 结尾/,文件名不以 结尾。当使用目录名称时,这意味着该目录中的所有文件都在同一层中。
层索引的典型示例是:
- “依赖”:
-“引导-INF/lib/dependency1.jar”
-“引导-INF/lib/dependency2.jar”
- “应用”:
-“引导-INF/类/”
- “元信息/”