Java 9 多版本 JAR:单一归档适配多平台类版本
多版本 JAR 概念
Java 9 增强 JAR 格式:META-INF/MANIFEST.MF 主属性添加 Multi-Release: true,META-INF/versions/ 目录下按主版本号存放版本专用类/资源(如 versions/9/、versions/10/)。
运行时 JVM 自动选择匹配最高兼容版本的类:Java 9 运行时优先加载 versions/9/ 下的类,Java 8 则回退到根目录类。
实战步骤
1. 准备 Java 7 版本类
# c:/test/java7/com/tutorialspoint/Tester.java
package com.tutorialspoint;
public class Tester {
public static void main(String[] args) {
System.out.println("Inside java 7");
}
}
2. 准备 Java 9 版本类
# c:/test/java9/com/tutorialspoint/Tester.java
package com.tutorialspoint;
public class Tester {
public static void main(String[] args) {
System.out.println("Inside java 9");
}
}
3. 分别编译
javac --release 9 java9/com/tutorialspoint/Tester.java
javac --release 7 java7/com/tutorialspoint/Tester.java
4. 创建多版本 JAR
jar -c -f test.jar -C java7 . --release 9 -C java9 .
-C java7 .:根目录放 Java 7 版本类(基准版本)。--release 9 -C java9 .:将 Java 9 编译产物放入META-INF/versions/9/。
5. 验证运行
# JDK 7 运行
java -cp test.jar com.tutorialspoint.Tester
# Output: Inside java 7
# JDK 9 运行
java -cp test.jar com.tutorialspoint.Tester
# Output: Inside java 9
结构示意
test.jar
├── META-INF/
│ ├── MANIFEST.MF # Multi-Release: true
│ └── versions/
│ └── 9/
│ └── com/tutorialspoint/Tester.class # Java 9 专用版本
└── com/tutorialspoint/Tester.class # 基准版本 (Java 7 兼容)
适用场景与注意事项
- 库作者:同一 JAR 同时支持旧版本与新版本 API(如使用 Java 9
StackWalker优化但保留 Java 8 兼容实现)。 - 限制:版本专用类不能引入新的公共 API(方法/字段/类),仅允许实现差异,否则破坏二进制兼容性。
- 资源文件(配置、属性)同样支持版本化存放。
- 构建工具支持:Maven (
maven-jar-plugin配置multiRelease)、Gradle (jar { manifest { attributes 'Multi-Release': 'true' } })。
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java if…else:控制流全解析
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 深入理解 Java Vector:用法、特性及与 ArrayList 的对比
- Java 9 多版本 JAR:单一归档适配多平台类版本