可执行 JAR 文件格式
spring-boot-loader
模块使得 Spring Boot 支持可执行的 jar 和 war 文件。如果你使用 Maven 插件或 Gradle 插件,可执行的 jar 文件会自动生成,通常你不需要了解它们是如何工作的细节。
如果你需要从不同的构建系统中创建可执行的 JAR 文件,或者你只是对底层技术感到好奇,本附录将提供一些背景信息。
章节摘要
📄️ 嵌套 JARs
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,请考虑以下替代方案: