При разработке библиотек часто требуется поддерживать несколько версий 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
Автор::