JEP 238:多版本 JAR 文件
概括
扩展 JAR 文件格式以允许多个 Java 发行版特定版本的类文件共存于单个存档中。
目标
-
增强 Java Archive Tool (
jar
),使其可以创建多版本 JAR 文件。 -
在 JRE 中实现多版本 JAR 文件,包括标准类加载器和
JarFile
API 中的支持。 -
增强其他关键工具(例如,
javac
、javap
、jdeps
等)来解释多版本 JAR 文件。 -
支持目标 1 至 3 的多版本模块化JAR 文件。
-
保持性能:使用多版本 JAR 文件的工具和组件的性能不得受到显着影响。特别是,访问普通(即非多版本)JAR 文件时的性能不得降低。
动机
第三方库和框架通常支持一系列 Java 平台版本,通常可以追溯到几个版本。因此,它们通常不会利用新版本中可用的语言或 API 功能,因为很难表达条件平台依赖性(这通常涉及反射)或为不同平台版本分发不同的库工件。
这会阻碍库和框架使用新功能,进而阻碍用户升级到新的 JDK 版本——这是一个阻碍采用的恶性循环,对每个人都不利。
此外,一些库和框架使用 JDK 的内部 API,当严格执行模块边界时,这些 API 在 Java 9 中将无法访问。当此类内部 API 有公共 的、受支持的 API 替代品时,这也会阻碍支持新平台版本。
描述
JAR 文件具有一个内容根(其中包含类和资源)以及一个META-INF
目录(其中包含有关 JAR 的元数据)。通过将一些版本控制元数据添加到特定的文件组,JAR 格式可以以兼容的方式为不同目标 Java 平台版本编码库的多个版本。
多版本 JAR(“MRJAR”)将包含主要属性:
Multi-Release: true
在 JAR 的主要部分中声明MANIFEST.MF
。属性名称也被声明为常量java.util.jar.Attributes.MULTI_RELEASE
。与其他主要属性一样,在 中声明的名称MANIFEST.MF
不区分大小写。该值也不区分大小写,但前面或后面不能有空格(这样的限制有助于确保满足性能目标)。