web-dev-qa-db-ja.com

Windowsを決定する方法Javaインストール場所

C#アセンブリから.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\JavaRuntimeEnvironment\1.6」)。および「HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\JavaRuntimeEnvironment\1.6.0_20」)。

C#アプリケーションから最新のJava.exeパスを見つけるための最も信頼できる「長距離」ソリューションは何でしょうか。

よろしくお願いします。

-編集-

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

あなたはレジストリを通してそれをすることができます。しかし、あなたは間違った場所を探していました。私はあなたのために簡単な例をまとめました:

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
}
28
djdd87

@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
Ondrej Svejdar

私の知る限り、システムにインストールされているJavaの最新バージョンはPATH環境変数で最初に見つかったものであるため、レジストリキーを探す必要はありません。 、実行するだけです。

試してください:

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

それが機能しない場合は、Java.exeがパスにあることを確認し、私に知らせてください。

1
Grzenio

所有者が答えを選んだよりも良い解決策を見つけたので、ちょっとしたバンプ。

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

        }
1
Jamie