This commit is contained in:
2026-09-29 09:40:37 +03:00
parent 441021b9a6
commit 6567e731d1
34 changed files with 57 additions and 709 deletions
+1 -12
View File
@@ -24,7 +24,6 @@ constexpr auto kExecutable = "java";
constexpr auto kWindowless = "java";
#endif
// Корни, в которых Windows/Linux/macOS обычно держат JDK и JRE.
QStringList installationRoots()
{
QStringList roots;
@@ -58,7 +57,6 @@ QStringList installationRoots()
return roots;
}
// Ищем именно java.exe: у javaw.exe нет вывода, а версию мы определяем запуском.
void appendIfExecutable(QStringList &target, const QString &binDir)
{
const QFileInfo info(binDir + u'/' + QString::fromLatin1(kExecutable));
@@ -69,21 +67,18 @@ void appendIfExecutable(QStringList &target, const QString &binDir)
target << path;
}
} // namespace
}
QStringList JavaLocator::findAll(const QString &gameDir)
{
QStringList result;
// 0. Сборки, скачанные самим лаунчером. Идут первыми: пользователь выбирал
// их осознанно, в отличие от того, что нашлось в системе.
const QList<InstalledJavaRuntime> managed = JavaRuntimeStore::installed();
for (const InstalledJavaRuntime &entry : managed) {
if (!result.contains(entry.javaPath))
result << entry.javaPath;
}
// 1. Рантайм, скачанный самим Minecraft: .minecraft/runtime/<component>/<os>/<component>/bin
const QString runtime = gameDir + QStringLiteral("/runtime");
if (QDir(runtime).exists()) {
QDirIterator it(runtime, QStringList{QString::fromLatin1(kExecutable)},
@@ -94,17 +89,14 @@ QStringList JavaLocator::findAll(const QString &gameDir)
}
}
// 2. JAVA_HOME
const QString javaHome = qEnvironmentVariable("JAVA_HOME");
if (!javaHome.isEmpty())
appendIfExecutable(result, javaHome + QStringLiteral("/bin"));
// 3. PATH
const QString onPath = QStandardPaths::findExecutable(QString::fromLatin1(kExecutable));
if (!onPath.isEmpty())
appendIfExecutable(result, QFileInfo(onPath).absolutePath());
// 4. Типовые каталоги установки
const QStringList roots = installationRoots();
for (const QString &root : roots) {
const QDir dir(root);
@@ -133,14 +125,12 @@ int JavaLocator::majorVersion(const QString &javaPath)
QProcess process;
process.start(javaPath, {QStringLiteral("-version")});
if (process.waitForFinished(5000)) {
// java печатает версию в stderr: openjdk version "17.0.2" 2022-01-18
const QString output = QString::fromLocal8Bit(process.readAllStandardError())
+ QString::fromLocal8Bit(process.readAllStandardOutput());
static const QRegularExpression re(QStringLiteral("version\\s+\"(\\d+)(?:\\.(\\d+))?"));
const QRegularExpressionMatch match = re.match(output);
if (match.hasMatch()) {
const int first = match.captured(1).toInt();
// До Java 9 версия выглядела как 1.8.0_301 — мажорная тут вторая цифра.
major = (first == 1) ? match.captured(2).toInt() : first;
}
}
@@ -166,7 +156,6 @@ QString JavaLocator::select(const QString &gameDir,
QStringList candidates;
if (!preferred.isEmpty()) {
QFileInfo info(preferred);
// В настройках можно указать как сам java.exe, так и корень JDK.
if (info.isDir())
appendIfExecutable(candidates, info.absoluteFilePath() + QStringLiteral("/bin"));
else if (info.isFile())