8.3 KiB
javaruntime.h — JavaRuntime, JavaRuntimeStore и JavaRequirement
Обзор
Minecraft_launcher умеет скачивать Java сам: официальные сборки Mojang — те же, которыми игру
запускает официальный лаунчер, — и сборки Eclipse Temurin в вариантах JDK и JRE. Скачанные сборки
живут в папке лаунчера, по одной подпапке на сборку.
Заголовок javaruntime.h — словарь этой части проекта. Он даёт перечисление видов сборок, две
структуры (строка каталога и уже установленная сборка), пространство имён для работы с папкой
<root>/java и таблицу требований версий игры к Java.
Заголовок подключают JavaRuntimeService (каталог), JavaInstaller (скачивание и распаковка) и LauncherBackend (отдача каталога в 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 — папка <root>/java
Устройство папки: одна подпапка на сборку плюс её описание внутри. Отдельного индекса нет намеренно — удалённую вручную папку не пришлось бы вычищать ещё и из общего файла.
QString dirFor(const QString &id)
Папка конкретной сборки внутри <root>/java.
QList<InstalledJavaRuntime> installed()
Всё, что лежит в <root>/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 и <optional> — только Qt Core. От классов
проекта не зависит.
Пример использования
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);
}
При создании этого документа использовался ИИ.