# javaruntime.h `javaruntime.h`, `javaruntime.cpp` Общие типы для Java: виды сборок, строка каталога, запись об установленной сборке, работа с папкой `/java` и таблица «какая Java нужна какой версии игры». ## Виды сборок | `JavaRuntimeKind` | Ключ | Что это | |-------------------|------|---------| | `Mojang` | `java` | сборки, которые Mojang раздаёт для своего лаунчера | | `Jdk` | `jdk` | Eclipse Temurin JDK | | `Jre` | `jre` | Eclipse Temurin JRE | `javaKindKey()`, `javaKindFromKey()`, `javaKindTitle()` переводят между перечислением, ключом и подписью для интерфейса. Ключ хранится в `runtime.json` установленной сборки и используется в QML. ## JavaRuntimeEntry Строка каталога [JavaRuntimeService](JavaRuntimeService.md), то есть то, что можно скачать. | Поле | Что это | |------|---------| | `id` | `temurin-jdk-21.0.12.1_1`, `mojang-java-runtime-delta` | | `kind` | | | `major` | 8, 17, 21… | | `version` | `21.0.12.1+1`, `21.0.7` | | `component` | только у Mojang: `java-runtime-delta` и т. п. | | `released` | | | `url` | архив Temurin или `manifest.json` компонента Mojang | | `checksum` | sha256 архива Temurin или sha1 манифеста Mojang | | `size` | размер загрузки, 0 если неизвестен | | `archive` | `zip`, `tar.gz` или `mojang` | | `architecture` | `x64`, `aarch64`; на macOS может быть не родной (см. JavaRuntimeService) | | `lts` | | ## InstalledJavaRuntime Скачанная сборка: `id`, `kind` (ключ), `major`, `version`, `javaPath` (абсолютный путь к `java`/`java.exe`), `size` (сколько заняла на диске). ## JavaRuntimeStore Каждая сборка лежит в `/java//`, а рядом с ней `runtime.json`: ```json { "id": "...", "kind": "jdk", "major": 21, "version": "21.0.7", "javaPath": "bin/java", "size": 197132288 } ``` `javaPath` хранится относительно папки сборки, так что папку лаунчера можно переносить. - `sanitizeId(id)` — всё, кроме букв, цифр, `.`, `-`, `_`, заменяется на `_`. Ведущие точки убираются. - `dirFor(id)` — `/java/`. - `find(id)` — читает `runtime.json`. Возвращает пусто, если файла нет, `id` в нём другой или `java` по указанному пути не существует. Поэтому недокачанная сборка без `runtime.json` в списке не появится. - `installed()` — всё, что нашлось, от новых мажорных версий к старым. - `locateBinary(rootDir)` — ищет `bin/java` внутри распакованного дерева и берёт самый короткий путь. Нужно потому, что у архивов разная вложенность: `jdk-21/bin`, `jdk-21/Contents/Home/bin` и т. п. - `writeMeta(runtime, &error)` — пишет `runtime.json` через `QSaveFile`. - `remove(id, &error)` — удаляет папку сборки. Перед этим проверяет, что путь лежит внутри `/java/`. ## JavaRequirement `minimumFor(minecraftVersionId)` — минимальная Java для версии игры: | Версия игры | Java | |-------------|------| | до 1.16 включительно, беты, альфы, всё нераспознанное | 8 | | 1.17 | 16 | | 1.18 — 1.20.4 | 17 | | 1.20.5 и новее | 21 | | версии с новой нумерацией (первое число не 1, например `26.1`) | 21 | | снапшоты `21wNNx` | 16 | | снапшоты `22w`, `23w` | 17 | | снапшоты `24w` и новее | 21 | | снапшоты до `21w` | 8 | Пустая строка даёт 0. Таблица нужна там, где описания версии ещё нет на диске: в окне выбора Java и при установке сезонной сборки. При запуске игры используется `javaVersion.majorVersion` из описания версии. Профили модлоадеров (`fabric-loader-...`) по этой таблице дают 8, поэтому бэкенд передаёт сюда `minecraftVersion` сборки, а не `resolvedVersionId`. `coverage(javaMajor)` — подпись для окна выбора: какие версии игры эта Java потянет. --- При создании этого документа использовался ИИ.