Files
BiLauncher/doc/cpp/javalocator.md
T
2026-10-11 22:32:13 +03:00

4.1 KiB
Raw Blame History

JavaLocator

javalocator.h, javalocator.cpp

Поиск java, уже установленной на машине, и выбор подходящей под версию игры. Скачиванием занимается JavaInstaller, а здесь только смотрим, что есть.

Это пространство имён со свободными функциями. Его используют GameLauncher при запуске, LauncherBackend для списка в настройках и для шага Java в установке сезонной сборки.

findAll(gameDir)

Список путей к исполняемому java (java.exe на Windows) без повторов. Порядок такой:

  1. сборки, скачанные лаунчером в <root>/java (через JavaRuntimeStore::installed());
  2. всё, что найдётся рекурсивно в <gameDir>/runtime: туда кладёт Java официальный лаунчер;
  3. $JAVA_HOME/bin;
  4. java из PATH;
  5. стандартные каталоги установки. На 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 из той же папки, если он там есть. Тогда при запуске игры не появляется консольное окно. На других системах возвращает путь без изменений.


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