Как определить место установки Windows Java - PullRequest
23 голосов
/ 14 июня 2010

Я пытаюсь динамически запустить .jar из сборки C # (используя 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 из приложения C #?

Заранее большое спасибо.

- РЕДАКТИРОВАТЬ -

Благодаря комбинации GenericTypeTea и Стивена Клири , я решил эту проблему следующим образом:

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

Ответы [ 3 ]

28 голосов
/ 14 июня 2010

Вы можете сделать это через реестр. Вы искали не в том месте, хотя. Я собрал для вас быстрый пример:

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
}
1 голос
/ 29 мая 2015

Построение поверх вопроса @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;
}
1 голос
/ 14 июня 2010

Насколько я знаю, идея заключается в том, что последняя версия Java, установленная в системе, является первой, найденной в переменной среды PATH, поэтому вам не нужно искать какие-либо ключи реестра, просто запустите программу.

Попытка:

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

Если это не работает, убедитесь, что java.exe находится на вашем пути, и дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...