60 lines
3.0 KiB
Markdown
60 lines
3.0 KiB
Markdown
---
|
||
aliases:
|
||
- MR-JAR
|
||
tags:
|
||
- maturity/🌱
|
||
date: 2025-02-26
|
||
---
|
||
При разработке библиотек часто требуется поддерживать несколько версий 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.
|
||
***
|
||
## Мета информация
|
||
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
|
||
**Родитель**::
|
||
**Источник**::
|
||
**Создана**:: [[2025-02-26]]
|
||
**Автор**::
|
||
### Дополнительные материалы
|
||
-
|
||
|
||
### Дочерние заметки
|
||
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
||
|