From 9462743dc93680dd30d2d68947abdc025412d16e Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Wed, 26 Feb 2025 15:12:07 +0300 Subject: [PATCH] Multi-Release JAR.md --- dev/cryptography/Скачать сертификат сайта.md | 11 ++-- dev/java/JDeps.md | 2 +- dev/java/Multi-Release JAR.md | 59 ++++++++++++++++++++ dev/snippet/Добавление сертификата в JVM.md | 16 ++++-- 4 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 dev/java/Multi-Release JAR.md diff --git a/dev/cryptography/Скачать сертификат сайта.md b/dev/cryptography/Скачать сертификат сайта.md index 277cf759..1c3d58b1 100644 --- a/dev/cryptography/Скачать сертификат сайта.md +++ b/dev/cryptography/Скачать сертификат сайта.md @@ -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 example.crt +``` -Скопированные данные вставить в текстовый документ и сохранить с расширением `*.cer`. *** ## Мета информация **Область**:: [[../../meta/zero/00 Криптография|00 Криптография]] diff --git a/dev/java/JDeps.md b/dev/java/JDeps.md index e0ef96b0..1cd3dc64 100644 --- a/dev/java/JDeps.md +++ b/dev/java/JDeps.md @@ -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 анализировать зависимости всех модулей рекурсивно. diff --git a/dev/java/Multi-Release JAR.md b/dev/java/Multi-Release JAR.md new file mode 100644 index 00000000..fa3993f7 --- /dev/null +++ b/dev/java/Multi-Release JAR.md @@ -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]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/snippet/Добавление сертификата в JVM.md b/dev/snippet/Добавление сертификата в JVM.md index 507f70b4..2a1f54d4 100644 --- a/dev/snippet/Добавление сертификата в JVM.md +++ b/dev/snippet/Добавление сертификата в JVM.md @@ -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]]