4.1 KiB
JavaLocator
javalocator.h, javalocator.cpp
Поиск java, уже установленной на машине, и выбор подходящей под версию игры. Скачиванием занимается JavaInstaller, а здесь только смотрим, что есть.
Это пространство имён со свободными функциями. Его используют GameLauncher при запуске, LauncherBackend для списка в настройках и для шага Java в установке сезонной сборки.
findAll(gameDir)
Список путей к исполняемому java (java.exe на Windows) без повторов. Порядок такой:
- сборки, скачанные лаунчером в
<root>/java(черезJavaRuntimeStore::installed()); - всё, что найдётся рекурсивно в
<gameDir>/runtime: туда кладёт Java официальный лаунчер; $JAVA_HOME/bin;javaизPATH;- стандартные каталоги установки. На Windows это
Program Files,Program Files (x86)иProgramW6432с подпапкамиJava,Eclipse Adoptium,Eclipse Foundation,AdoptOpenJDK,Amazon Corretto,Zulu,BellSoft,Microsoft,Semeruи JBR из Android Studio. На macOS это/Library/Java/JavaVirtualMachinesи такая же папка в домашнем каталоге. На Linux —/usr/lib/jvm,/usr/java,/opt/java,/opt/jdk.
В каждом каталоге установки проверяются bin, Contents/Home/bin (так устроены JDK на macOS) и
jre/bin.
majorVersion(javaPath)
Запускает java -version и достаёт мажорную версию из строки version "...". Старая схема
1.8.0_x даёт 8. Если процесс не ответил за 5 секунд или вывод не разобрался, возвращается 0.
Результат кэшируется в статической таблице на всё время работы лаунчера. Если java по тому же пути обновить, лаунчер узнает об этом только после перезапуска. Кэш не защищён от гонок, поэтому функцию можно вызывать только из одного потока, и в проекте это GUI-поток.
select(gameDir, requiredMajor, preferred, &error)
Выбирает java для запуска.
- Если
preferredзадан, он идёт первым кандидатом. Это может быть путь к файлу или к домашней папке JDK (тогда берётсяbin/java). Если по этому пути ничего нет, функция сразу возвращает ошибку и других кандидатов не смотрит: пользователь явно указал путь, и молча подменять его было бы неправильно. - Дальше добавляется всё из
findAll(). - Возвращается первый кандидат с версией не ниже
requiredMajor. Если таких нет, вerrorпишется, какая самая новая java нашлась и где.
Функция возвращает первую подходящую, а не самую новую. Поэтому скачанная лаунчером Java 17 выиграет у системной Java 21, если игре нужна 17.
windowlessVariant(javaPath)
На Windows заменяет java.exe на javaw.exe из той же папки, если он там есть. Тогда при запуске
игры не появляется консольное окно. На других системах возвращает путь без изменений.
При создании этого документа использовался ИИ.