2026-10-11 22:32:13 +03:00
|
|
|
|
# javaruntime.h
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
`javaruntime.h`, `javaruntime.cpp`
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Общие типы для Java: виды сборок, строка каталога, запись об установленной сборке, работа с папкой
|
|
|
|
|
|
`<root>/java` и таблица «какая Java нужна какой версии игры».
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
## Виды сборок
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
| `JavaRuntimeKind` | Ключ | Что это |
|
|
|
|
|
|
|-------------------|------|---------|
|
|
|
|
|
|
| `Mojang` | `java` | сборки, которые Mojang раздаёт для своего лаунчера |
|
|
|
|
|
|
| `Jdk` | `jdk` | Eclipse Temurin JDK |
|
|
|
|
|
|
| `Jre` | `jre` | Eclipse Temurin JRE |
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
`javaKindKey()`, `javaKindFromKey()`, `javaKindTitle()` переводят между перечислением, ключом и
|
|
|
|
|
|
подписью для интерфейса. Ключ хранится в `runtime.json` установленной сборки и используется в QML.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
## JavaRuntimeEntry
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Строка каталога [JavaRuntimeService](JavaRuntimeService.md), то есть то, что можно скачать.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
| Поле | Что это |
|
|
|
|
|
|
|------|---------|
|
|
|
|
|
|
| `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` | |
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
## InstalledJavaRuntime
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Скачанная сборка: `id`, `kind` (ключ), `major`, `version`, `javaPath` (абсолютный путь к
|
|
|
|
|
|
`java`/`java.exe`), `size` (сколько заняла на диске).
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
## JavaRuntimeStore
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Каждая сборка лежит в `<root>/java/<id>/`, а рядом с ней `runtime.json`:
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
```json
|
|
|
|
|
|
{ "id": "...", "kind": "jdk", "major": 21, "version": "21.0.7", "javaPath": "bin/java", "size": 197132288 }
|
2026-09-03 09:16:56 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
`javaPath` хранится относительно папки сборки, так что папку лаунчера можно переносить.
|
|
|
|
|
|
|
|
|
|
|
|
- `sanitizeId(id)` — всё, кроме букв, цифр, `.`, `-`, `_`, заменяется на `_`. Ведущие точки
|
|
|
|
|
|
убираются.
|
|
|
|
|
|
- `dirFor(id)` — `<root>/java/<sanitizeId(id)>`.
|
|
|
|
|
|
- `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)` — удаляет папку сборки. Перед этим проверяет, что путь лежит внутри
|
|
|
|
|
|
`<root>/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 потянет.
|
|
|
|
|
|
|
2026-09-03 09:16:56 +03:00
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
При создании этого документа использовался ИИ.
|