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

61 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# JavaLocator
`javalocator.h`, `javalocator.cpp`
Поиск java, уже установленной на машине, и выбор подходящей под версию игры. Скачиванием
занимается [JavaInstaller](JavaInstaller.md), а здесь только смотрим, что есть.
Это пространство имён со свободными функциями. Его используют [GameLauncher](GameLauncher.md) при
запуске, [LauncherBackend](LauncherBackend.md) для списка в настройках и для шага 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` из той же папки, если он там есть. Тогда при запуске
игры не появляется консольное окно. На других системах возвращает путь без изменений.
---
При создании этого документа использовался ИИ.