可执行 Jar 格式
spring-boot-loader 模块使 Spring Boot 能够支持可执行的 jar 和 war 文件。如果你使用 Maven 插件或 Gradle 插件,可执行 jar 会自动生成,通常你无需了解其工作原理的细节。
如果你需要从不同的构建系统创建可执行 JAR 文件,或者只是对底层技术感到好奇,本附录提供了一些背景信息。
章节总结
📄️ 嵌套的 JAR 文件
Java 没有提供任何标准方式来加载嵌套的 jar 文件(即本身包含在另一个 jar 文件中的 jar 文件)。如果你需要分发一个自包含的应用程序,并且希望无需解压即可从命令行运行,这可能会带来问题。
📄️ Spring Boot 的 “NestedJarFile” 类
用于支持加载嵌套 jar 的核心类是 NestedJarFile。它允许你从嵌套的子 jar 数据中加载 jar 内容。首次加载时,每个 JarEntry 的位置都会映射到外部 jar 的物理文件偏移量,如下例所示:
📄️ 启动可执行的 JAR 文件
Launcher 类是一个特殊的引导类,用作可执行 jar 文件的主入口点。它是 jar 文件中实际的 Main-Class,用于设置适当的 ClassLoader 并最终调用你的 main() 方法。
📄️ PropertiesLauncher 特性
PropertiesLauncher 具有一些特殊功能,可通过外部属性(系统属性、环境变量、清单条目或 loader.properties)启用。下表描述了这些属性:
📄️ 可执行 Jar 的限制
在使用 Spring Boot Loader 打包的应用程序时,你需要考虑以下限制:
📄️ 替代的单 JAR 解决方案
如果上述限制意味着你无法使用 Spring Boot Loader,请考虑以下替代方案: