Java 9: Мультирелизные JAR-файлы

Java 9 新特性Новые возможности Java 9

Функция многорелизного JAR позволяет создавать версии классов, которые выбираются только при запуске библиотечных программ в определённой версии среды Java.

с помощью параметра--releaseдля указания версии компиляции.

Конкретное изменение заключается в том, что в файл MANIFEST.MF в каталоге META-INF добавлен новый атрибут:

Multi-Release: true

Кроме того, в каталоге META-INF добавляется каталог versions. Если требуется поддержка Java 9, в каталоге versions есть каталог 9.

multirelease.jar
├── META-INF
│   └── versions
│       └── 9
│           └── multirelease
│               └── Helper.class
├── multirelease
    ├── Helper.class
    └── Main.class

В следующем примере мы используем функцию многорелизного JAR, чтобы создать две версии jar-пакета из файла Tester.java — одну для JDK 7, другую для JDK 9, — а затем выполняем их в разных средах.

Шаг 1

Создайте папку c:/test/java7/com/example и создайте в этой папке файл Test.java. Код выглядит следующим образом:

Пример

package com.example;

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

Шаг 2

Создайте папку c:/test/java9/com/example и создайте в этой папке файл Test.java. Код выглядит следующим образом:

Пример

package com.example;

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

Скомпилируйте исходный код:

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

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

Создайте многорелизный JAR-файл

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

Выполните с использованием JDK 7:

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

Выполните с использованием JDK 9:

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

Java 9 新特性Новые возможности Java 9

Другие расширения