javac.exeをプログラムで見つけるにはどうすればよいですか?
-
06-07-2019 - |
質問
C#コードからjavacを呼び出しています。元々、その場所は次のようにしか見つかりませんでした。
protected static string JavaHome
{
get
{
return Environment.GetEnvironmentVariable("JAVA_HOME");
}
}
ただし、新しいコンピューターにJDKをインストールしたところ、JAVA_HOME環境変数が自動的に設定されないことがわかりました。環境変数の要求は、過去10年間Windowsアプリケーションでは受け入れられないため、JAVA_HOME環境変数が設定されていない場合にjavacを見つける方法が必要です:
protected static string JavaHome
{
get
{
string home = Environment.GetEnvironmentVariable("JAVA_HOME");
if (string.IsNullOrEmpty(home) || !Directory.Exists(home))
{
// TODO: find the JDK home directory some other way.
}
return home;
}
}
解決
Windowsを使用している場合は、レジストリを使用します:
HKEY_LOCAL_MACHINE \ SOFTWARE \ JavaSoft \ Java Development Kit
そうでない場合は、ほとんどenv変数にこだわっています。 this ブログがあります。便利なエントリ。
280Z28による編集:
そのレジストリキーの下はCurrentVersion値です。この値は、次の場所でJavaホームを見つけるために使用されます。
HKEY_LOCAL_MACHINE \ SOFTWARE \ JavaSoft \ Java Development Kit \ {CurrentVersion} \ JavaHome
private static string javaHome;
protected static string JavaHome
{
get
{
string home = javaHome;
if (home == null)
{
home = Environment.GetEnvironmentVariable("JAVA_HOME");
if (string.IsNullOrEmpty(home) || !Directory.Exists(home))
{
home = CheckForJavaHome(Registry.CurrentUser);
if (home == null)
home = CheckForJavaHome(Registry.LocalMachine);
}
if (home != null && !Directory.Exists(home))
home = null;
javaHome = home;
}
return home;
}
}
protected static string CheckForJavaHome(RegistryKey key)
{
using (RegistryKey subkey = key.OpenSubKey(@"SOFTWARE\JavaSoft\Java Development Kit"))
{
if (subkey == null)
return null;
object value = subkey.GetValue("CurrentVersion", null, RegistryValueOptions.None);
if (value != null)
{
using (RegistryKey currentHomeKey = subkey.OpenSubKey(value.ToString()))
{
if (currentHomeKey == null)
return null;
value = currentHomeKey.GetValue("JavaHome", null, RegistryValueOptions.None);
if (value != null)
return value.ToString();
}
}
}
return null;
}
他のヒント
おそらく、レジストリでJDKインストールアドレスを検索する必要があります。
別の方法として、このの説明を参照してください。
64ビットOS(Windows 7)の場合、レジストリキーは下にある可能性があります
HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ JavaSoft \ Java Development Kit
32ビットJDKを実行している場合。したがって、上記に基づいてすべてのコードを作成した場合は、もう一度テストしてください。