4.9 KiB
javaruntime.h
javaruntime.h, javaruntime.cpp
Общие типы для Java: виды сборок, строка каталога, запись об установленной сборке, работа с папкой
<root>/java и таблица «какая Java нужна какой версии игры».
Виды сборок
JavaRuntimeKind |
Ключ | Что это |
|---|---|---|
Mojang |
java |
сборки, которые Mojang раздаёт для своего лаунчера |
Jdk |
jdk |
Eclipse Temurin JDK |
Jre |
jre |
Eclipse Temurin JRE |
javaKindKey(), javaKindFromKey(), javaKindTitle() переводят между перечислением, ключом и
подписью для интерфейса. Ключ хранится в runtime.json установленной сборки и используется в QML.
JavaRuntimeEntry
Строка каталога JavaRuntimeService, то есть то, что можно скачать.
| Поле | Что это |
|---|---|
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
Каждая сборка лежит в <root>/java/<id>/, а рядом с ней runtime.json:
{ "id": "...", "kind": "jdk", "major": 21, "version": "21.0.7", "javaPath": "bin/java", "size": 197132288 }
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 потянет.
При создании этого документа использовался ИИ.