无法创建 Java 虚拟机 javaw.exe.我的世界



我正在尝试使用C#创建一个客户端,该客户端使用一些指定启动Minecraft的参数打开javaw.exe。是的,这毫无意义,但我这样做是为了我自己的研究。当使用 javaw.exe 文件的文件路径时,我似乎无法让它工作。相反,它会抛出一个错误,指出

错误:无法创建 Java 虚拟机。 错误:发生致命异常。程序将退出。

此错误并未准确说明发生了什么。如果有日志,请告诉我,但就我谷歌研究而言,它可能意味着 200+ 件事。

但 如果我只使用文件路径javaw.exe而不定义它的位置来启动它,它可以工作,但我发现它不适用于其他 java 安装。有点想知道为什么这也是,但这是一个附带问题。

我已经用谷歌搜索了有关此错误的所有内容,但是发生这种情况的原因太多了,所以我计划将其布置在一些代码中,以便其他代码帮助我弄清楚到底发生了什么。

Java 路径函数:(我不认为这是"被盗代码"的功劳)

private string GetJavaInstallationPath()
{
string environmentPath = Environment.GetEnvironmentVariable("JAVA_HOME");
if (!string.IsNullOrEmpty(environmentPath))
{
return environmentPath;
}
string javaKey = "SOFTWARE\JavaSoft\Java Runtime Environment\";
using (Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(javaKey))
{
string currentVersion = rk.GetValue("CurrentVersion").ToString();
using (Microsoft.Win32.RegistryKey key = rk.OpenSubKey(currentVersion))
{
return key.GetValue("JavaHome").ToString();
}
}
}

请注意,我从下面的列表中删除了很多库,只是为了更容易阅读参数。 完整代码更靠后 启动我的世界功能:

private void StartMinecraft()
{
string installPath = GetJavaInstallationPath();
string filePath = System.IO.Path.Combine(installPath, "bin\javaw.exe");
if (System.IO.File.Exists(filePath))
{
using (Process myProcess = new Process())
{
Environment.SetEnvironmentVariable("APPDATA", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)+ "\AkumaMC\");
string userpath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string libpath = userpath + "\.AkumaMC";
string gamepath = libpath;
string assetdir = gamepath + "\assets\";
string accesstoken = accessToken;
string argument = "-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -classpath "+ libpath + " -Djava.library.path=" + gamepath + @"runGame -Dminecraft.launcher.brand=minecraft-launcher -Dminecraft.launcher.version=2.1.5387 -Dminecraft.client.jar=" + libpath + @"versions1.12.21.12.2.jar -cp " + libpath + @"librariesnetminecraftforgeforge1.12.2-14.23.5.2838forge-1.12.2-14.23.5.2838.jar;" + libpath + @"librariesnetminecraftlaunchwrapper1.12launchwrapper-1.12.jar;" + libpath + @"versions1.12.21.12.2.jar -Xmx"+(SettingsUC.ramInt / 1024).ToString()+@"G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M -Dlog4j.configurationFile=" + libpath + @"assetslog_configsclient-1.12.xml net.minecraft.launchwrapper.Launch --username " + uname + @" --version 1.12.2-forge --gameDir " + libpath + " --assetsDir " + libpath + @"assets --assetIndex 1.12 --uuid " + uuidPlayer + @" --accessToken " + accesstoken + @" --userType mojang --tweakClass net.minecraftforge.fml.common.launcher.FMLTweaker --versionType Forge";
myProcess.StartInfo.UseShellExecute = false;
// You can start any process, HelloWorld is a do-nothing example.
myProcess.StartInfo.FileName = filePath;
myProcess.StartInfo.Verb = "runas";
myProcess.StartInfo.CreateNoWindow = true;
myProcess.StartInfo.Arguments = argument;
Console.WriteLine(filePath + argument);
Console.WriteLine((SettingsUC.ramInt / 1024).ToString() + " Is the GB #");
myProcess.Start();
if (!SettingsUC.KeepLauncherOpen == true)
{
Application.Exit();
}
}
//Application.Exit();
}
else
{
MessageBox.Show("Cannot find Java installation. Please reinstall the latest version of Java and try again.", "AkumaMC Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

}

完全启动我的世界功能:

private void StartMinecraft()
{
string installPath = GetJavaInstallationPath();
string filePath = System.IO.Path.Combine(installPath, "bin\javaw.exe");
if (System.IO.File.Exists(filePath))
{
using (Process myProcess = new Process())
{
Environment.SetEnvironmentVariable("APPDATA", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)+ "\AkumaMC\");
string userpath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string libpath = userpath + "\.AkumaMC";
string gamepath = libpath;
string assetdir = gamepath + "\assets\";
string accesstoken = accessToken;
string argument = "-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -classpath "+ libpath + " -Djava.library.path=" + gamepath + @"runGame -Dminecraft.launcher.brand=minecraft-launcher -Dminecraft.launcher.version=2.1.5387 -Dminecraft.client.jar=" + libpath + @"versions1.12.21.12.2.jar -cp " + libpath + @"librariesnetminecraftforgeforge1.12.2-14.23.5.2838forge-1.12.2-14.23.5.2838.jar;" + libpath + @"librariesnetminecraftlaunchwrapper1.12launchwrapper-1.12.jar;" + libpath + @"librariesorgow2asmasm-all5.2asm-all-5.2.jar;" + libpath + @"librariesorgjlinejline3.5.1jline-3.5.1.jar;" + libpath + @"librariesnetjavadevjnajna4.4.0jna-4.4.0.jar;" + libpath + @"librariescomtypesafeakkaakka-actor_2.112.3.3akka-actor_2.11-2.3.3.jar;" + libpath + @"librariescomtypesafeconfig1.2.1config-1.2.1.jar;" + libpath + @"librariesorgscala-langscala-actors-migration_2.111.1.0scala-actors-migration_2.11-1.1.0.jar;" + libpath + @"librariesorgscala-langscala-compiler2.11.1scala-compiler-2.11.1.jar;" + libpath + @"librariesorgscala-langpluginsscala-continuations-library_2.111.0.2scala-continuations-library_2.11-1.0.2.jar;" + libpath + @"librariesorgscala-langpluginsscala-continuations-plugin_2.11.11.0.2scala-continuations-plugin_2.11.1-1.0.2.jar;" + libpath + @"librariesorgscala-langscala-library2.11.1scala-library-2.11.1.jar;" + libpath + @"librariesorgscala-langscala-parser-combinators_2.111.0.1scala-parser-combinators_2.11-1.0.1.jar;" + libpath + @"librariesorgscala-langscala-reflect2.11.1scala-reflect-2.11.1.jar;" + libpath + @"librariesorgscala-langscala-swing_2.111.0.1scala-swing_2.11-1.0.1.jar;" + libpath + @"librariesorgscala-langscala-xml_2.111.0.2scala-xml_2.11-1.0.2.jar;" + libpath + @"librarieslzmalzma.0.1lzma-0.0.1.jar;" + libpath + @"librariesnetsfjopt-simplejopt-simple5.0.3jopt-simple-5.0.3.jar;" + libpath + @"librariesjava3dvecmath1.5.2vecmath-1.5.2.jar;" + libpath + @"librariesnetsftrove4jtrove4j3.0.3trove4j-3.0.3.jar;" + libpath + @"librariesorgapachemavenmaven-artifact3.5.3maven-artifact-3.5.3.jar;" + libpath + @"librariescommojangpatchy1.1patchy-1.1.jar;" + libpath + @"librariesoshi-projectoshi-core1.1oshi-core-1.1.jar;" + libpath + @"librariesnetjavadevjnajna4.4.0jna-4.4.0.jar;" + libpath + @"librariesnetjavadevjnaplatform3.4.0platform-3.4.0.jar;" + libpath + @"librariescomibmicuicu4j-core-mojang51.2icu4j-core-mojang-51.2.jar;" + libpath + @"librariesnetsfjopt-simplejopt-simple5.0.3jopt-simple-5.0.3.jar;" + libpath + @"librariescompaulscodecodecjorbis20101023codecjorbis-20101023.jar;" + libpath + @"librariescompaulscodecodecwav20101023codecwav-20101023.jar;" + libpath + @"librariescompaulscodelibraryjavasound20101123libraryjavasound-20101123.jar;" + libpath + @"librariescompaulscodelibrarylwjglopenal20100824librarylwjglopenal-20100824.jar;" + libpath + @"librariescompaulscodesoundsystem20120107soundsystem-20120107.jar;" + libpath + @"librariesionettynetty-all4.1.9.Finalnetty-all-4.1.9.Final.jar;" + libpath + @"librariescomgoogleguavaguava21.0guava-21.0.jar;" + libpath + @"librariesorgapachecommonscommons-lang33.5commons-lang3-3.5.jar;" + libpath + @"librariescommons-iocommons-io2.5commons-io-2.5.jar;" + libpath + @"librariescommons-codeccommons-codec1.10commons-codec-1.10.jar;" + libpath + @"librariesnetjavajinputjinput2.0.5jinput-2.0.5.jar;" + libpath + @"librariesnetjavajutilsjutils1.0.0jutils-1.0.0.jar;" + libpath + @"librariescomgooglecodegsongson2.8.0gson-2.8.0.jar;" + libpath + @"librariescommojangauthlib1.5.25authlib-1.5.25.jar;" + libpath + @"librariescommojangrealms1.10.22realms-1.10.22.jar;" + libpath + @"librariesorgapachecommonscommons-compress1.8.1commons-compress-1.8.1.jar;" + libpath + @"librariesorgapachehttpcomponentshttpclient4.3.3httpclient-4.3.3.jar;" + libpath + @"librariescommons-loggingcommons-logging1.1.3commons-logging-1.1.3.jar;" + libpath + @"librariesorgapachehttpcomponentshttpcore4.3.2httpcore-4.3.2.jar;" + libpath + @"librariesitunimidsifastutil7.1.0fastutil-7.1.0.jar;" + libpath + @"librariesorgapachelogginglog4jlog4j-api2.8.1log4j-api-2.8.1.jar;" + libpath + @"librariesorgapachelogginglog4jlog4j-core2.8.1log4j-core-2.8.1.jar;" + libpath + @"librariesorglwjgllwjgllwjgl2.9.4-nightly-20150209lwjgl-2.9.4-nightly-20150209.jar;" + libpath + @"librariesorglwjgllwjgllwjgl_util2.9.4-nightly-20150209lwjgl_util-2.9.4-nightly-20150209.jar;" + libpath + @"librariescommojangtext2speech1.10.3text2speech-1.10.3.jar;" + libpath + @"versions1.12.21.12.2.jar -Xmx"+(SettingsUC.ramInt / 1024).ToString()+@"G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M -Dlog4j.configurationFile=" + libpath + @"assetslog_configsclient-1.12.xml net.minecraft.launchwrapper.Launch --username " + uname + @" --version 1.12.2-forge --gameDir " + libpath + " --assetsDir " + libpath + @"assets --assetIndex 1.12 --uuid " + uuidPlayer + @" --accessToken " + accesstoken + @" --userType mojang --tweakClass net.minecraftforge.fml.common.launcher.FMLTweaker --versionType Forge";
myProcess.StartInfo.UseShellExecute = false;
// You can start any process, HelloWorld is a do-nothing example.
myProcess.StartInfo.FileName = filePath;
myProcess.StartInfo.Verb = "runas";
myProcess.StartInfo.CreateNoWindow = true;
myProcess.StartInfo.Arguments = argument;
Console.WriteLine(filePath + argument);
Console.WriteLine((SettingsUC.ramInt / 1024).ToString() + " Is the GB #");
myProcess.Start();
if (!SettingsUC.KeepLauncherOpen == true)
{
Application.Exit();
}
}
//Application.Exit();
}
else
{
MessageBox.Show("Cannot find Java installation. Please reinstall the latest version of Java and try again.", "AkumaMC Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

}

我预计它会启动我的世界,相反,它只是抛出一个错误。虽然如果我改变

myProcess.StartInfo.FileName = filePath;
TO
myProcess.StartInfo.FileName = "javaw.exe";

它可以工作,但仅适用于我的 java 安装(所以我认为)

感谢所有给予的帮助!

更新:在反馈之后,我认为这是由于它位于带有空格的文件夹中。那么,有没有办法完全拉取注册表键值。经过搜索,我找到了那把钥匙。GetValue()。ToString() 只返回第一个单词的字符串,而不返回"句子"或"完整路径"。

看起来通过帖子上的评论,我能够缩小范围并解决问题。它正在为 java 位置寻找 32 位版本的注册表。大多数人在这一点上有 64 位,所以我只是添加了对操作系统的检查,然后检查了该操作系统的注册表。

如果您有兴趣自己执行此操作,我建议您使用下面的更新代码,以更好地跟踪正确的java文件夹。

private string GetJavaInstallationPath()
{
string environmentPath = Environment.GetEnvironmentVariable("JAVA_HOME");
if (!string.IsNullOrEmpty(environmentPath))
{
return environmentPath;
}
string javaKey = "SOFTWARE\JavaSoft\Java Runtime Environment\";
if (!Environment.Is64BitOperatingSystem)
{
using (Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(javaKey))
{
string currentVersion = rk.GetValue("CurrentVersion").ToString();
using (Microsoft.Win32.RegistryKey key = rk.OpenSubKey(currentVersion))
{
return key.GetValue("JavaHome").ToString();//Not Pullying full string
}
}
}
else
{
using (var view64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
RegistryView.Registry64))
{
using (var clsid64 = view64.OpenSubKey(javaKey))
{
string currentVersion = clsid64.GetValue("CurrentVersion").ToString();
using (RegistryKey key = clsid64.OpenSubKey(currentVersion))
{
return key.GetValue("JavaHome").ToString();//Not Pullying full string
}
}
}
}
}

最新更新