Files
digital-garden/dev/java/Multi-Release JAR.md
Struchkov Mark 9462743dc9
All checks were successful
continuous-integration/drone/push Build is passing
Multi-Release JAR.md
2025-02-26 15:12:07 +03:00

60 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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) -->