如何确定Windows Java安装位置

我试图从一个C#程序集(使用Process.Start(info) )dynamic运行.jar。 现在,从一个控制台应用程序,我可以运行:

 ProcessStartInfo info = new ProcessStartInfo("java", "-jar somerandom.jar"); 

然而,在一个程序Win32Exception ,我总是得到一个“系统找不到指定的文件”的Win32Exception ,并且必须将行更改为Java的完整path,如下所示:

 ProcessStartInfo info = new ProcessStartInfo("C:\\Program Files\\Java\\jre6\\bin\\java.exe", "-jar somerandom.jar"); 

这显然不会。 我需要一种dynamic(但是声明式)确定Java安装位置的方法。

我开始考虑到registry,但是当我到达那里时,我注意到有版本的特定键,他们甚至不能保证是数字(例如“HKEY_LOCAL_MACHINE \ SOFTWARE \ JavaSoft \ Java运行时环境\ 1.6”和“HKEY_LOCAL_MACHINE \ SOFTWARE \ JavaSoft \ Java Runtime Environment \ 1.6.0_20”)。

从C#应用程序中查找最新的java.exepath,最可靠的“远程”解决scheme是什么?

非常感谢。

– 编辑 –

感谢GenericTypeTea和Stephen Cleary的答案,我已经解决了以下问题:

 private String GetJavaInstallationPath() { String javaKey = "SOFTWARE\\JavaSoft\\Java Runtime Environment"; using (var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(javaKey)) { String currentVersion = baseKey.GetValue("CurrentVersion").ToString(); using (var homeKey = baseKey.OpenSubKey(currentVersion)) return homeKey.GetValue("JavaHome").ToString(); } } 

你可以通过注册表来完成。 尽管你看错了地方。 我为你敲了一个快速的例子:

 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(); } } } 

然后使用它,只需执行以下操作:

 string installPath = GetJavaInstallationPath(); string filePath = System.IO.Path.Combine(installPath, "bin\\Java.exe"); if (System.IO.File.Exists(filePath)) { // We have a winner } 

据我所知,这个想法是在系统上安装的最新版本的Java是第一个在PATH环境变量中找到的,所以你不需要查找任何注册表项,只需要运行它。

尝试:

 ProcessStartInfo info = new ProcessStartInfo("java.exe", "-jar somerandom.jar"); 

如果它不起作用,请确保java.exe在你的路径,让我知道。

建立在@GenericTypeTea问题的顶部 – 这是一种如何检查x32 / x64的方法。

 static string GetJavaInstallationPath() { string environmentPath = Environment.GetEnvironmentVariable("JAVA_HOME"); if (!string.IsNullOrEmpty(environmentPath)) { return environmentPath; } const string JAVA_KEY = "SOFTWARE\\JavaSoft\\Java Runtime Environment\\"; var localKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32); using (var rk = localKey.OpenSubKey(JAVA_KEY)) { if (rk != null) { string currentVersion = rk.GetValue("CurrentVersion").ToString(); using (var key = rk.OpenSubKey(currentVersion)) { return key.GetValue("JavaHome").ToString(); } } } localKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64); using (var rk = localKey.OpenSubKey(JAVA_KEY)) { if (rk != null) { string currentVersion = rk.GetValue("CurrentVersion").ToString(); using (var key = rk.OpenSubKey(currentVersion)) { return key.GetValue("JavaHome").ToString(); } } } return null; }