4.7 KiB
JavaRuntimeService
javaruntimeservice.h, javaruntimeservice.cpp
Каталог сборок Java, которые лаунчер может скачать. Устроен как
VersionManifestService, но кэш хранится сутки и лежит в
<root>/cache/java_runtimes.json.
Источников два:
- Mojang (в интерфейсе категория «Java») — те же рантаймы, с которыми игру запускает официальный лаунчер. Их немного, зато с игрой они точно совместимы.
- Eclipse Temurin (JDK и JRE) — свежие сборки всех мажорных версий, в том числе тех, которых у Mojang ещё нет.
В каталог попадают только сборки под текущую ОС и архитектуру.
Экземпляр держит LauncherBackend, ставит сборки JavaInstaller.
Как обновляется каталог
Запросы идут параллельно. Каталог заменяется целиком, когда ответят все.
api.adoptium.net/v3/info/available_releases— какие мажорные версии есть и какие из них LTS.- Для каждой мажорной версии
assets/feature_releases/<major>/gaс фильтрами: ОС, архитектура, HotSpot, обычная куча, vendoreclipse, три последних релиза. Из каждого берутся бинарники сimage_type=jdkилиjreв виде.zipили.tar.gzпоhttps. 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-<jdk|jre>-<версия>-<арх> и mojang-<компонент>, пропущенные через
JavaRuntimeStore::sanitizeId().
Версия Temurin 8 показывается как 8u<security>, остальные — как openjdk_version без -LTS.
Мажорная версия у Mojang берётся из имени (8u… → 8, иначе первое число).
У сборок Mojang size равен 0: в каталоге указан только размер манифеста, а не рантайма.
Если какие-то запросы упали, а другие ответили, каталог всё равно обновляется, а предупреждения
склеиваются через ; . Если не пришло ничего, но старые данные есть, колбэк получает ok = true и
предупреждение.
Кэш помечается платформой (mojangPlatform()). Кэш с другой платформы не читается. Это возможно,
например, если папку лаунчера перенесли с другой машины.
Методы
ensureLoaded(callback, forceRefresh)— как у манифеста версий.entries(kind)— строки одного вида, отсортированы по мажорной версии, потом по дате выхода, новые сверху.find(id).bestFor(major)— что скачать, если игре нужна Javamajor, а подходящей нет. Выбирается наименьшая мажорная версия не нижеmajor. При равенстве порядок такой: Temurin JDK, потом Mojang, потом Temurin JRE. JDK идёт первым, потому что установщикам Forge и NeoForge иногда нужны инструменты из полного комплекта. Если и здесь равенство, берётся более свежая.isRefreshing(),hasData().
Сигналы: catalogChanged(), refreshingChanged().
При создании этого документа использовался ИИ.