# javaruntime.h — JavaRuntime, JavaRuntimeStore и JavaRequirement ## Обзор `Minecraft_launcher` умеет скачивать Java сам: официальные сборки Mojang — те же, которыми игру запускает официальный лаунчер, — и сборки Eclipse Temurin в вариантах JDK и JRE. Скачанные сборки живут в папке лаунчера, по одной подпапке на сборку. Заголовок `javaruntime.h` — словарь этой части проекта. Он даёт перечисление видов сборок, две структуры (строка каталога и уже установленная сборка), пространство имён для работы с папкой `/java` и таблицу требований версий игры к Java. Заголовок подключают [JavaRuntimeService](JavaRuntimeService.md) (каталог), [JavaInstaller](JavaInstaller.md) (скачивание и распаковка) и [LauncherBackend](LauncherBackend.md) (отдача каталога в QML). ## Типы | Имя | Вид | Описание | |-----|-----|----------| | `JavaRuntimeKind` | `enum class` | Откуда взялась сборка и что именно в ней лежит | | `JavaRuntimeEntry` | `struct` | Строка каталога — то, что можно скачать | | `InstalledJavaRuntime` | `struct` | Сборка, уже распакованная в папке лаунчера | ### JavaRuntimeKind | Значение | Ключ | Описание | |----------|------|----------| | `Mojang` | `java` | Тот же рантайм, которым игру запускает официальный лаунчер | | `Jdk` | `jdk` | Eclipse Temurin JDK: компилятор и инструменты в комплекте | | `Jre` | `jre` | Eclipse Temurin JRE: только то, что нужно для запуска | Эти же ключи служат именами категорий в окне выбора Java. ### JavaRuntimeEntry | Поле | Тип | Описание | |------|-----|----------| | `id` | `QString` | Идентификатор сборки, например `temurin-jdk-21.0.12.1_1` или `mojang-java-runtime-delta` | | `kind` | `JavaRuntimeKind` | Вид сборки; по умолчанию `Jdk` | | `major` | `int` | Мажорная версия: 8, 17, 21… | | `version` | `QString` | Полная версия, например `21.0.12.1+1` или `21.0.7` | | `component` | `QString` | Имя компонента вида `java-runtime-delta`; только у сборок Mojang | | `released` | `QDateTime` | Дата выпуска; по ней каталог сортируется новыми вперёд | | `url` | `QUrl` | Архив Temurin либо `manifest.json` компонента Mojang | | `checksum` | `QString` | sha256 архива Temurin или sha1 манифеста Mojang | | `size` | `qint64` | Размер загрузки в байтах; `0` — неизвестен | | `archive` | `QString` | Формат: `zip`, `tar.gz` или `mojang` — последний означает не архив, а манифест с пофайловой загрузкой | | `architecture` | `QString` | `x64` или `aarch64`; на macOS бывает и не родная архитектура | | `lts` | `bool` | Версия с длительной поддержкой; помечается в списке | Метод `isValid()` возвращает `true`, когда заполнен `id`, `major` больше нуля и `url` корректен. ### InstalledJavaRuntime | Поле | Тип | Описание | |------|-----|----------| | `id` | `QString` | Идентификатор сборки, он же имя подпапки | | `kind` | `QString` | Вид сборки строкой: `java`, `jdk` или `jre` | | `major` | `int` | Мажорная версия | | `version` | `QString` | Полная версия | | `javaPath` | `QString` | Абсолютный путь к исполняемому файлу `java` или `java.exe` | | `size` | `qint64` | Сколько сборка заняла на диске по итогам установки | ## Функции ### Перевод видов сборок #### QString javaKindKey(JavaRuntimeKind kind) Строковый ключ вида сборки: `java`, `jdk` или `jre`. #### std::optional<JavaRuntimeKind> javaKindFromKey(const QString &key) Обратный перевод; `std::nullopt` для неизвестного ключа. #### QString javaKindTitle(JavaRuntimeKind kind) Человекочитаемое название вида сборки для интерфейса. ### JavaRuntimeStore — папка `/java` Устройство папки: одна подпапка на сборку плюс её описание внутри. Отдельного индекса нет намеренно — удалённую вручную папку не пришлось бы вычищать ещё и из общего файла. #### QString dirFor(const QString &id) Папка конкретной сборки внутри `/java`. #### QList<InstalledJavaRuntime> installed() Всё, что лежит в `/java` и на что нашлась java. Новые версии идут первыми. #### std::optional<InstalledJavaRuntime> find(const QString &id) Описание одной установленной сборки; `std::nullopt`, если такой нет. #### QString locateBinary(const QString &rootDir) Ищет `bin/java` в распакованном дереве. Раскладка отличается между поставщиками: у Temurin на macOS это `Contents/Home/bin`, у Mojang — `jre.bundle/Contents/Home/bin`. #### bool writeMeta(const InstalledJavaRuntime &runtime, QString \*error) Записывает описание сборки в её папку. Вызывается по завершении установки. При неудаче возвращает `false` и заполняет `error`. #### bool remove(const QString &id, QString \*error) Удаляет папку сборки целиком. При неудаче возвращает `false` и заполняет `error`. #### QString sanitizeId(const QString &id) Превращает идентификатор каталога в безопасное имя папки: всё, кроме букв, цифр, точки, дефиса и подчёркивания, заменяется. Идентификатор приходит из сети, поэтому подставлять его в путь как есть нельзя. ### JavaRequirement — какая Java нужна какой версии игры Точный ответ лежит в `client.json` версии (поле `javaVersion.majorVersion`) и берётся оттуда при запуске. Эта таблица нужна раньше — когда версия ещё не скачана, а подсказку в каталоге показать надо. #### int minimumFor(const QString &minecraftVersionId) Минимальная мажорная версия Java для версии игры; `0`, если разобрать идентификатор версии не удалось. #### QString coverage(int javaMajor) Подпись к строке каталога вида «Minecraft 1.20.5 и новее» — какие версии игры покрывает эта версия Java. ## Зависимости Подключает `QDateTime`, `QList`, `QString`, `QUrl` и `` — только Qt Core. От классов проекта не зависит. ## Пример использования ```cpp const auto runtime = JavaRuntimeStore::find(settings.javaRuntime); if (runtime && QFileInfo::exists(runtime->javaPath)) { javaPath = runtime->javaPath; } else { // сборка удалена вручную — возвращаемся к поиску в системе javaPath = JavaLocator::select(gameDir, version.javaMajor, settings.javaPath, &error); } ``` --- При создании этого документа использовался ИИ.