JEP 386: Alpine Linux Port
Порт на Alpine Linux
| Ответственный | Boris Ulasevich |
| Тип | Feature |
| Область | Implementation |
| Статус | Closed / Delivered |
| Выпуск | 16 |
| Компонент | hotspot / runtime |
| Обсуждение | portola dash dev at openjdk dot java dot net |
| Трудоёмкость | M |
| Длительность | M |
| Рецензенты | Alan Bateman, Vladimir Kozlov |
| Одобрен | Mikael Vidstedt |
| Создан | 2019/08/13 10:33 |
| Обновлён | 2024/08/02 14:44 |
| Задача | 8229469 |
Аннотация
Портировать JDK на Alpine Linux и на другие дистрибутивы Linux, где основной библиотекой C служит musl, для архитектур x64 и AArch64,
Мотивация
Musl — реализация для систем на базе Linux функциональности стандартной библиотеки, описанной в стандартах ISO C и POSIX. На musl основаны несколько дистрибутивов Linux, в том числе Alpine Linux и OpenWrt, а некоторые другие предоставляют musl как дополнительный пакет (например, Arch Linux).
Дистрибутив Alpine Linux широко используется в облачных развёртываниях, микросервисах и контейнерных средах благодаря малому размеру образа. Например, Docker-образ Alpine Linux занимает меньше 6 МБ. Если Java будет работать в таких средах сразу, без дополнительной настройки, Tomcat, Jetty, Spring и другие популярные фреймворки смогут работать в них нативно.
Уменьшив размер среды выполнения Java с помощью jlink (JEP 282), пользователь сможет создать ещё более компактный образ для запуска конкретного приложения. Набор модулей, нужных приложению, можно определить командой jdeps. Например, если целевое приложение зависит только от модуля java.base, то Docker-образ с Alpine Linux и средой выполнения Java, содержащей только этот модуль и server VM, занимает 38 МБ.
Та же мотивация относится и к встраиваемым системам, где размер тоже ограничен.
Описание
Этот JEP предполагает перенести наработки проекта Portola в основной репозиторий.
Этот порт не будет поддерживать механизм подключения (attach) HotSpot Serviceability Agent.
Для сборки варианта JDK с musl на Alpine Linux нужны следующие пакеты:
alpine-sdk alsa-lib alsa-lib-dev autoconf bash cups-dev cups-libs fontconfig fontconfig-dev freetype freetype-dev grep libx11 libx11-dev libxext libxext-dev libxrandr libxrandr-dev libxrender libxrender-dev libxt libxt-dev libxtst libxtst-dev linux-headers zip
После установки этих пакетов JDK собирается как обычно.
Порты с musl для других архитектур могут быть реализованы в последующих улучшениях, если на них будет спрос.
Альтернативы
-
Оставить порт с musl вне основного репозитория, в проекте Portola.
-
Использовать слой совместимости с glibc, предоставляемый системой, или собрать glibc и включить её в образ ОС. Недостаток этой альтернативы в том, что образ становится больше и появляется зависимость, не входящая в базовый образ ОС. Для сценария облачного развёртывания, если базовый образ Alpine Linux 3.11 с musl занимает 5,6 МБ, дополнительный слой glibc — 26 МБ, а среда выполнения Java с модулем
java.baseи server VM — 38 МБ, то слой совместимости с glibc увеличивает статический размер образа на 30 %.
Тестирование
-
Поскольку порт затрагивает общий код, перед интеграцией мы запустим тесты JCK и JTreg на дистрибутивах Linux на базе glibc (x64, AArch64 и ARM32), Windows и Mac, чтобы убедиться в отсутствии регрессий.
-
Мы проверим качество порта с musl, запустив соответствующее подмножество тестов JTreg на Alpine Linux. Мы убедимся, что Portola, перенесённый в текущий производственный выпуск JDK, проходит JCK на Alpine Linux. Мы проведём базовое тестирование (sanity testing) на OpenWrt.
-
Мы определим новое подмножество тестов JTreg, подходящих для musl, в группе тестов
vm.musl.