# JavaRuntimeService `javaruntimeservice.h`, `javaruntimeservice.cpp` Каталог сборок Java, которые лаунчер может скачать. Устроен как [VersionManifestService](VersionManifestService.md), но кэш хранится сутки и лежит в `/cache/java_runtimes.json`. Источников два: - **Mojang** (в интерфейсе категория «Java») — те же рантаймы, с которыми игру запускает официальный лаунчер. Их немного, зато с игрой они точно совместимы. - **Eclipse Temurin** (JDK и JRE) — свежие сборки всех мажорных версий, в том числе тех, которых у Mojang ещё нет. В каталог попадают только сборки под текущую ОС и архитектуру. Экземпляр держит [LauncherBackend](LauncherBackend.md), ставит сборки [JavaInstaller](JavaInstaller.md). ## Как обновляется каталог Запросы идут параллельно. Каталог заменяется целиком, когда ответят все. 1. `api.adoptium.net/v3/info/available_releases` — какие мажорные версии есть и какие из них LTS. 2. Для каждой мажорной версии `assets/feature_releases//ga` с фильтрами: ОС, архитектура, HotSpot, обычная куча, vendor `eclipse`, три последних релиза. Из каждого берутся бинарники с `image_type` = `jdk` или `jre` в виде `.zip` или `.tar.gz` по `https`. 3. `piston-meta.mojang.com/.../java-runtime/.../all.json` — раздел под текущую платформу (`windows-x64`, `mac-os-arm64`, `linux` и т. п.), по одному варианту на компонент. Компонент `minecraft-java-exe` пропускается: это не Java. **Нет сборки под aarch64.** У Temurin под ARM нет Java 8 и 16. Если для aarch64 ничего не нашлось, запрос повторяется для `x64`. На Mac с Apple Silicon такая сборка работает через Rosetta. Сейчас повтор делается на любой ОС с aarch64, хотя комментарий в заголовке говорит только про macOS. Id строк: `temurin--<версия>-<арх>` и `mojang-<компонент>`, пропущенные через `JavaRuntimeStore::sanitizeId()`. Версия Temurin 8 показывается как `8u`, остальные — как `openjdk_version` без `-LTS`. Мажорная версия у Mojang берётся из имени (`8u…` → 8, иначе первое число). У сборок Mojang `size` равен 0: в каталоге указан только размер манифеста, а не рантайма. Если какие-то запросы упали, а другие ответили, каталог всё равно обновляется, а предупреждения склеиваются через `; `. Если не пришло ничего, но старые данные есть, колбэк получает `ok = true` и предупреждение. Кэш помечается платформой (`mojangPlatform()`). Кэш с другой платформы не читается. Это возможно, например, если папку лаунчера перенесли с другой машины. ## Методы - `ensureLoaded(callback, forceRefresh)` — как у манифеста версий. - `entries(kind)` — строки одного вида, отсортированы по мажорной версии, потом по дате выхода, новые сверху. - `find(id)`. - `bestFor(major)` — что скачать, если игре нужна Java `major`, а подходящей нет. Выбирается наименьшая мажорная версия не ниже `major`. При равенстве порядок такой: Temurin JDK, потом Mojang, потом Temurin JRE. JDK идёт первым, потому что установщикам Forge и NeoForge иногда нужны инструменты из полного комплекта. Если и здесь равенство, берётся более свежая. - `isRefreshing()`, `hasData()`. Сигналы: `catalogChanged()`, `refreshingChanged()`. --- При создании этого документа использовался ИИ.