Как определить место установки Windows Java
Я пытаюсь динамически запускать .jar из сборки С# (используя Process.Start(info)
). Теперь из консольного приложения я могу просто запустить:
ProcessStartInfo info = new ProcessStartInfo("java", "-jar somerandom.jar");
Однако в сборке я продолжаю получать Win32Exception
"Система не может найти указанный файл" и должна изменить строку на полный путь Java, например:
ProcessStartInfo info = new ProcessStartInfo("C:\\Program Files\\Java\\jre6\\bin\\java.exe", "-jar somerandom.jar");
Это, очевидно, не будет. Мне нужен способ динамически (но декларативно) определить установленное местоположение Java.
Я начал думать о поиске в реестре, но когда я добрался туда, я заметил, что существуют определенные ключи для версий и что они даже не могут быть числовыми (например, "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.6" и "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.6.0_20" ).
Что было бы самым надежным решением для "дальних" решений для поиска самого современного пути java.exe из приложения С#?
Спасибо большое заблаговременно.
- EDIT -
Благодаря сочетанию 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();
}
}
Ответы
Ответ 1
Вы можете сделать это через реестр. Однако вы искали не то место. Я сделал вам быстрый пример:
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
}
Ответ 2
Насколько я знаю, идея в том, что последняя версия Java, установленная в системе, является первой, найденной в переменной среды PATH, поэтому вам не нужно искать какие-либо ключи реестра, просто запустите ее.
Try:
ProcessStartInfo info = new ProcessStartInfo("java.exe", "-jar somerandom.jar");
Если он не работает, убедитесь, что java.exe находится на вашем пути и сообщите мне.
Ответ 3
Построение в верхней части вопроса @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;
}
Ответ 4
Просто быстрый удар, потому что я нашел лучшее решение, чем владелец выбрал ответ.
Я обнаружил, что он работает только с 32-битной Java и в настоящее время, это довольно устарело. Для этого я сделал корректировку для 64-битных систем. Надеюсь, что это помогает кому-то еще, ищущему способ проложить путь.
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();
}
}
}
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();
}
}
}
}
}