При разработке библиотек часто требуется поддерживать несколько версий Java. В стандартном JAR-файле все классы работают на минимальной поддерживаемой версии JDK, что накладывает ограничения на использование новых возможностей языка и API.

MR-JAR решает эту проблему, позволяя включать в один JAR-файл классы, оптимизированные для разных версий Java. Это особенно полезно для библиотек, которые:

  • Должны поддерживать старые версии JDK.
  • Хотят использовать новые API в современных версиях.
  • Избегают дублирования кода в отдельных JAR-файлах под каждую версию Java.

Структура MR-JAR

Файлы, специфичные для версий Java, размещаются внутри JAR-файла в каталоге META-INF/versions/{версия}/. Пример структуры MR-JAR:

my-library.jar
├── META-INF/
│   ├── versions/
│   │   ├── 9/
│   │   │   ├── MyClass.class  (оптимизирован для Java 9)
│   │   ├── 11/
│   │   │   ├── MyClass.class  (оптимизирован для Java 11)
│   │   ├── 17/
│   │   │   ├── MyClass.class  (оптимизирован для Java 17)
├── MyClass.class  (базовая версия)

Когда JVM загружает классы, она выбирает наиболее подходящую версию:

  • Если используется JDK 8, загружается MyClass.class из корня.
  • Если JDK 9, 11 или 17, JVM выбирает класс из соответствующего каталога META-INF/versions/{версия}/.

Создание MR-JAR

Создать MR-JAR можно с помощью jar-утилиты:

jar --create --file my-library.jar --main-class com.example.Main -C classes . \
    --release 9 -C classes-java9 . \
    --release 11 -C classes-java11 .

Здесь:

  • classes — базовая версия классов (Java 8 и младше).
  • classes-java9 — версия классов для Java 9.
  • classes-java11 — версия классов для Java 11.

Мета информация

Область:: 00 Java разработка
Родитель::
Источник::
Создана:: 2025-02-26
Автор::

Дополнительные материалы

Дочерние заметки