Files
minecraft-launcher/doc/cpp/javalocator.md
T
2026-09-03 09:16:56 +03:00

4.2 KiB

javalocator.h — JavaLocator

Обзор

Для запуска Minecraft нужна Java подходящей версии: старым версиям игры — восьмая, новым — семнадцатая или двадцать первая. Лаунчер умеет скачивать сборки Java сам (см. JavaInstaller), но сначала стоит посмотреть, что уже есть на машине.

JavaLocator отвечает за поиск: собирает все доступные java, определяет их версии и выбирает подходящую под требование версии игры. Пространство имён используется при подготовке запуска и при показе списка найденных Java в настройках.

Пространства имён

JavaLocator группирует четыре функции поиска и выбора. Состояния нет, но результат определения версии кэшируется внутри реализации.

Функции

QStringList findAll(const QString &gameDir)

Все java, которые удалось найти, без дублей и в порядке приоритета. Просматриваются четыре источника: рантайм самого Minecraft внутри папки игры, переменная JAVA_HOME, переменная PATH и стандартные каталоги установки JDK и JRE.

Параметр gameDir — папка игры; из неё берётся первый источник.

Результат показывается в диалоге настроек списком «что нашлось в системе».

int majorVersion(const QString &javaPath)

Мажорная версия java по её пути: 8, 17, 21 и так далее. Возвращает 0, если запустить исполняемый файл не удалось — путь неверен, файл не исполняемый или это не java.

Результат кэшируется: определение версии требует запуска процесса, а один и тот же путь проверяется многократно.

QString windowlessVariant(const QString &javaPath)

Заменяет java.exe на javaw.exe, чтобы игра не открывала окно консоли. На Unix возвращает вход без изменений — там разницы нет.

QString select(const QString &gameDir, int requiredMajor, const QString &preferred, QString *error)

Выбирает java не ниже requiredMajor. Если задан preferred — путь, указанный пользователем в настройках, — он проверяется первым и, если подходит, побеждает. Иначе перебираются найденные findAll() варианты.

При неудаче возвращает пустую строку и заполняет error — текст объясняет, что именно не нашлось: подходящей версии нет вовсе или указанный пользователем путь не подошёл.

Функция запускает процессы для определения версий, поэтому может занять заметное время; вызывать её в обработчике нажатия не стоит.

Зависимости

Подключает QString и QStringList. От классов проекта не зависит.

Пример использования

QString error;
const QString java = JavaLocator::select(gameDir,
                                         version.javaMajor,
                                         settings.javaPath,
                                         &error);
if (java.isEmpty()) {
    emit launchError(error);
    return;
}

process.start(JavaLocator::windowlessVariant(java), arguments);

При создании этого документа использовался ИИ.