GH-907 improve Java testing and PermGen deprecation handling

This commit is contained in:
Petr Mrázek
2015-05-04 01:20:48 +02:00
parent 8e9d5f56b5
commit 1b884d0a9d
24 changed files with 515 additions and 231 deletions

View File

@ -9,11 +9,15 @@ MinecraftInstance::MinecraftInstance(SettingsObjectPtr globalSettings, SettingsO
{
// Java Settings
m_settings->registerSetting("OverrideJava", false);
m_settings->registerSetting("OverrideJavaLocation", false);
auto locationOverride = m_settings->registerSetting("OverrideJavaLocation", false);
m_settings->registerSetting("OverrideJavaArgs", false);
m_settings->registerOverride(globalSettings->getSetting("JavaPath"));
m_settings->registerOverride(globalSettings->getSetting("JvmArgs"));
// special!
m_settings->registerPassthrough(globalSettings->getSetting("JavaTimestamp"), locationOverride);
m_settings->registerPassthrough(globalSettings->getSetting("JavaVersion"), locationOverride);
// Window Size
m_settings->registerSetting("OverrideWindow", false);
m_settings->registerOverride(globalSettings->getSetting("LaunchMaximized"));

View File

@ -16,6 +16,8 @@
*/
#include "minecraft/MinecraftProcess.h"
#include "BaseInstance.h"
#include <java/JavaChecker.h>
#include <MMCStrings.h>
#include <QDataStream>
#include <QFile>
@ -141,11 +143,18 @@ QStringList MinecraftProcess::javaArguments() const
args << QString("-Xms%1m").arg(m_instance->settings().get("MinMemAlloc").toInt());
args << QString("-Xmx%1m").arg(m_instance->settings().get("MaxMemAlloc").toInt());
auto permgen = m_instance->settings().get("PermGen").toInt();
if (permgen != 64)
// No PermGen in newer java.
auto javaVersion = m_instance->settings().get("JavaVersion");
if(Strings::naturalCompare(javaVersion.toString(), "1.8.0", Qt::CaseInsensitive) < 0)
{
args << QString("-XX:PermSize=%1m").arg(permgen);
auto permgen = m_instance->settings().get("PermGen").toInt();
if (permgen != 64)
{
args << QString("-XX:PermSize=%1m").arg(permgen);
}
}
args << "-Duser.language=en";
if (!m_nativeFolder.isEmpty())
args << QString("-Djava.library.path=%1").arg(m_nativeFolder);
@ -167,12 +176,8 @@ void MinecraftProcess::arm()
m_instance->setLastLaunch();
QStringList args = javaArguments();
QString JavaPath = m_instance->settings().get("JavaPath").toString();
emit log("Java path is:\n" + JavaPath + "\n\n");
QString allArgs = args.join(", ");
emit log("Java Arguments:\n[" + censorPrivateInfo(allArgs) + "]\n\n");
auto realJavaPath = QStandardPaths::findExecutable(JavaPath);
if (realJavaPath.isEmpty())
@ -182,6 +187,57 @@ void MinecraftProcess::arm()
MessageLevel::Warning);
}
// check java version here.
{
QFileInfo javaInfo(realJavaPath);
qlonglong javaUnixTime = javaInfo.lastModified().toMSecsSinceEpoch();
auto storedUnixTime = m_instance->settings().get("JavaTimestamp").toLongLong();
// if they are not the same, check!
if(javaUnixTime != storedUnixTime)
{
QEventLoop ev;
auto checker = std::make_shared<JavaChecker>();
bool successful = false;
QString errorLog;
QString version;
emit log(tr("Checking Java version..."), MessageLevel::MultiMC);
connect(checker.get(), &JavaChecker::checkFinished,
[&](JavaCheckResult result)
{
successful = result.valid;
errorLog = result.stderr;
version = result.javaVersion;
ev.exit();
});
checker->m_path = realJavaPath;
checker->performCheck();
ev.exec();
if(!successful)
{
// Error message displayed if java can't start
emit log(tr("Could not start java:"), MessageLevel::Error);
auto lines = errorLog.split('\n');
for(auto line: lines)
{
emit log(line, MessageLevel::Error);
}
emit log("\nCheck your MultiMC Java settings.", MessageLevel::MultiMC);
m_instance->cleanupAfterRun();
emit launch_failed(m_instance);
// not running, failed
m_instance->setRunning(false);
return;
}
emit log(tr("Java version is %1!\n").arg(version), MessageLevel::MultiMC);
m_instance->settings().set("JavaVersion", version);
m_instance->settings().set("JavaTimestamp", javaUnixTime);
}
}
QStringList args = javaArguments();
QString allArgs = args.join(", ");
emit log("Java Arguments:\n[" + censorPrivateInfo(allArgs) + "]\n\n");
// instantiate the launcher part
start(JavaPath, args);
if (!waitForStarted())