61 lines
4.1 KiB
Markdown
61 lines
4.1 KiB
Markdown
# 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` из той же папки, если он там есть. Тогда при запуске
|
||
игры не появляется консольное окно. На других системах возвращает путь без изменений.
|
||
|
||
---
|
||
|
||
При создании этого документа использовался ИИ.
|