2026-10-11 22:32:13 +03:00
|
|
|
|
# JavaLocator
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
`javalocator.h`, `javalocator.cpp`
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Поиск java, уже установленной на машине, и выбор подходящей под версию игры. Скачиванием
|
|
|
|
|
|
занимается [JavaInstaller](JavaInstaller.md), а здесь только смотрим, что есть.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Это пространство имён со свободными функциями. Его используют [GameLauncher](GameLauncher.md) при
|
|
|
|
|
|
запуске, [LauncherBackend](LauncherBackend.md) для списка в настройках и для шага Java в установке
|
|
|
|
|
|
сезонной сборки.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
## findAll(gameDir)
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Список путей к исполняемому `java` (`java.exe` на Windows) без повторов. Порядок такой:
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
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`.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
В каждом каталоге установки проверяются `bin`, `Contents/Home/bin` (так устроены JDK на macOS) и
|
|
|
|
|
|
`jre/bin`.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
## majorVersion(javaPath)
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Запускает `java -version` и достаёт мажорную версию из строки `version "..."`. Старая схема
|
|
|
|
|
|
`1.8.0_x` даёт 8. Если процесс не ответил за 5 секунд или вывод не разобрался, возвращается 0.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Результат кэшируется в статической таблице на всё время работы лаунчера. Если java по тому же пути
|
|
|
|
|
|
обновить, лаунчер узнает об этом только после перезапуска. Кэш не защищён от гонок, поэтому
|
|
|
|
|
|
функцию можно вызывать только из одного потока, и в проекте это GUI-поток.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
## select(gameDir, requiredMajor, preferred, &error)
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Выбирает java для запуска.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
- Если `preferred` задан, он идёт первым кандидатом. Это может быть путь к файлу или к домашней
|
|
|
|
|
|
папке JDK (тогда берётся `bin/java`). Если по этому пути ничего нет, функция сразу возвращает
|
|
|
|
|
|
ошибку и других кандидатов не смотрит: пользователь явно указал путь, и молча подменять его
|
|
|
|
|
|
было бы неправильно.
|
|
|
|
|
|
- Дальше добавляется всё из `findAll()`.
|
|
|
|
|
|
- Возвращается первый кандидат с версией не ниже `requiredMajor`. Если таких нет, в `error`
|
|
|
|
|
|
пишется, какая самая новая java нашлась и где.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Функция возвращает первую подходящую, а не самую новую. Поэтому скачанная лаунчером Java 17
|
|
|
|
|
|
выиграет у системной Java 21, если игре нужна 17.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
## windowlessVariant(javaPath)
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
На Windows заменяет `java.exe` на `javaw.exe` из той же папки, если он там есть. Тогда при запуске
|
|
|
|
|
|
игры не появляется консольное окно. На других системах возвращает путь без изменений.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
При создании этого документа использовался ИИ.
|