Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误和异常

Java 多线程

Java 同步

Java 网络

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 杂项

Java API 和框架

Java 类引用

Java 有用资源

Java - 多版本 Jar 文件



多版本 JAR 功能在 Java 9 中引入。它允许使用与多个 Java 版本相关的多个版本的类。例如,许多第三方库或框架使用 Java。由于 Java 作为一门语言不断发展,并且每个主要版本都会向该语言添加许多新功能。由于第三方库/框架必须重写其代码库以适应新功能,因此团队极不情愿使用新功能。这阻碍了他们迁移到新的Java 版本

为了解决维护同一文件的多源代码或特定于平台的文件版本的问题,引入了多版本 JAR 功能。请考虑以下示例

一个典型的 jar 文件将所有类都放在根级别。

jar root
   - Calculator.class
   - Util.class
   - Math.class
   - Service.class

如果我们有 Java 9 功能特定的Util 类,则该 jar 无法在 JRE 8 或更低版本中使用。

在多版本 Jar 中,格式已增强,可以维护和使用特定于平台的不同版本的Java 类 或资源。在 JAR 中,文件 MANIFEST.MF 文件在其主部分中有一个条目 Multi-Release: true。META-INF 目录还包含一个 versions 子目录,其子目录(从 Java 9 开始为 9)存储特定于版本的类和资源文件。

使用 MANIFEST.MF,我们可以将特定于 Java 9 或更高版本的类指定在不同的位置,如下所示

Java 多版本 Jar 文件目录结构

jar root
   - Calculator.class
   - Util.class
   - Math.class
   - Service.class
   META-INF
      - versions
      - 9
         - Util.class
         - Math.class
      - 10
         - Util.class
         - Math.class

现在,如果 JRE 不支持多版本 jar,则它将选择根级别的类进行加载和执行,否则将加载特定于版本的类。例如,如果上述 jar 在 Java 8 中使用,则将使用根级别的 Util.class。如果同一 jar 由 Java 9 执行,则将选择 Java 9 特定版本的类,依此类推。这样,第三方库/框架可以支持新功能,而无需更改针对较低版本编写的源代码。

在 Java 中创建和使用多版本 Jar 文件

在此示例中,我们将创建和使用一个多版本 jar,以使 Tester.java 文件有两个版本,一个用于 jdk 7,一个用于 jdk 9,并在不同的 jdk 版本上运行它。

以下是在 Java 中创建和使用多版本 jar 文件的步骤:

步骤 1:创建 Java 7 特定的 Java 类

让我们创建一个 Java 类,该类可能包含 Java 7 特定的代码和功能,这些功能在 Java 9 之前不可用。在此示例中,我们只是简单地打印一条消息以展示此功能的使用。

创建一个文件夹 c:/test/java7/com/tutorialspoint。创建包含以下内容的 Tester.java:

Tester.java

这是一个简单的代码,当程序执行时,我们将打印一条 Java 7 特定的消息。

package com.tutorialspoint;

public class Tester {
   public static void main(String[] args) {
      System.out.println("Inside java 7");
   }
}

步骤 2:创建 Java 9 特定的 Java 类

让我们创建一个 Java 类,该类可能包含特定于 Java 9 增强的代码和功能,这些功能在 Java 9 之前不可用。在此示例中,我们只是简单地打印一条消息以展示此功能的使用。

创建文件夹 c:/test/java9/com/tutorialspoint。创建 Tester.java 文件,内容如下:

Tester.java

这与上面的代码类似,在程序执行时打印 Java 9 特定的消息。

package com.tutorialspoint;

public class Tester {
   public static void main(String[] args) {
      System.out.println("Inside java 9");
   }
}

为了使用多版本 jar 功能,必须确保两个类的签名相同。公共接口(例如方法签名)在两个类中应该相同。

步骤 3:使用目标版本编译

C:\test > javac --release 9 java9/com/tutorialspoint/Tester.java

C:\JAVA > javac --release 7 java7/com/tutorialspoint/Tester.java

步骤 4:创建多版本 JAR

C:\JAVA > jar -c -f test.jar -C java7 . --release 9 -C java9.
Warning: entry META-INF/versions/9/com/tutorialspoint/Tester.java, 
   multiple resources with same name

步骤 5:使用 JDK 7 运行 JAR

C:\JAVA > java -cp test.jar com.tutorialspoint.Tester
Inside Java 7

步骤 6:使用 JDK 9 运行 JAR

C:\JAVA > java -cp test.jar com.tutorialspoint.Tester
Inside Java 9

结论

我们可以看到,使用多版本 Jar 功能,可以在不影响向后兼容性的情况下创建类的多个版本。我们展示了可以使用相同的命令来执行一个类。根据 META-INF 文件中列出的 JRE 版本,会选择相应的类。如果 JRE 版本较低,不支持多版本 jar,则会选择根级别的类,而不是版本特定的类。最后,版本化类的公共方法的签名应该相同,以便此功能能够完美运行。

广告