Multi-Release JAR.md
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Struchkov Mark
2025-02-26 15:12:07 +03:00
parent ee66c043b8
commit 9462743dc9
4 changed files with 78 additions and 10 deletions

View File

@@ -3,16 +3,19 @@ tags:
- maturity/🌱
date:
- - 2024-01-10
zero-link: []
parents:
---
```shell
openssl s_client -showcerts -connect www.example.com:443
```
Эта команда выведет сертификат в консоль. Далее нужно скопировать все, что между `-----BEGIN CERTIFICATE-----` и `-----END CERTIFICATE-----` включая эти строки.
Эта команда выведет сертификат в консоль. Далее нужно скопировать все, что между `-----BEGIN CERTIFICATE-----` и `-----END CERTIFICATE-----` включая эти строки. Скопированные данные вставить в текстовый документ и сохранить с расширением `*.crt`.
Или можно сразу скачать сертификат в файл командой
```shell
openssl s_client -showcerts -connect www.example.com:443 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > example.crt
```
Скопированные данные вставить в текстовый документ и сохранить с расширением `*.cer`.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Криптография|00 Криптография]]

View File

@@ -21,7 +21,7 @@ Output:
jdk.zipfs,jdk.management,jdk.crypto.cryptoki,java.security.jgss,jdk.crypto.ec
```
- `--multi-release 17`: указывает на использование многоверсионного JAR-файла для JDK 17, что позволяет учитывать разные версии классов для разных версий JDK.
- `--multi-release 17`: указывает на использование многоверсионного JAR-файла для JDK 17, что позволяет учитывать разные версии классов для разных версий JDK. Подробнее [[Multi-Release JAR]]
- `--ignore-missing-deps`: игнорирует отсутствующие зависимости, чтобы избежать ошибок при их отсутствии.
- `-q`: отключает подробный вывод, что делает команду менее «шумной» и оставляет только ключевые данные.
- `-recursive`: указывает JDeps анализировать зависимости всех модулей рекурсивно.

View File

@@ -0,0 +1,59 @@
---
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) -->

View File

@@ -1,15 +1,16 @@
---
tags:
- maturity/🌱
- maturity/🌳
date:
- - 2024-01-10
---
Первым делом необходимо [скачать сертификат сайта](../cryptography/Скачать%20сертификат%20сайта.md).
> [!NOTE] Инструкция по скачиванию сертификата
> Первым делом необходимо [скачать сертификат сайта](../cryptography/Скачать%20сертификат%20сайта.md).
Теперь используя `keytool` добавим сертификат в JVM.
Используя `keytool` добавим сертификат в JVM.
```shell
keytool -importcert -file cert_name.cer -keystore keystore_path -storepass "changeit" -noprompt -alias "alias_cert"
keytool -importcert -file cert_name.crt -keystore keystore_path -storepass "changeit" -noprompt -alias "alias_cert"
```
Где
@@ -19,8 +20,13 @@ keytool -importcert -file cert_name.cer -keystore keystore_path -storepass "chan
- `alias_cert` - алиас для сертификата
> [!WARNING]
> Возможно потребуется выход из системы, чтобы применились изменения.
> Потребуется выход из операционной системы, чтобы применились изменения.
Проверка, что сертификат был добавлен:
```shell
keytool -list -keystore keystore_path -alias alias_cert
```
***
## Мета информация
**Область**:: [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]