Wie finde ich javac.exe programmatisch?
-
06-07-2019 - |
Frage
Ich rufe Javac von C # -Code. Ursprünglich fand ich seine Lage nur wie folgt:
protected static string JavaHome
{
get
{
return Environment.GetEnvironmentVariable("JAVA_HOME");
}
}
Allerdings habe ich gerade installierte das JDK auf einen neuen Computer und fand, dass es nicht automatisch die Umgebungsvariable JAVA_HOME gesetzt hat. Erfordern eine Umgebungsvariable ist nicht akzeptabel, in jeder Windows-Anwendung für die letzten zehn Jahre, so brauche ich einen Weg javac zu finden, wenn die Umgebungsvariable JAVA_HOME nicht gesetzt ist:
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;
}
}
Lösung
Wenn Sie unter Windows sind, verwenden Registrierung:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Javasoft \ Java Development Kit
Wenn Sie nicht sind, sind Sie ziemlich viel mit env Variablen fest. Sie könnten dieses Blog finden Eintrag nützlich.
Herausgegeben von 280Z28:
Unter diesem Registrierungsschlüssel ist ein Wert für Currentversion. Dieser Wert wird verwendet, um den Java-Home unter folgenden Adresse zu finden:
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;
}
Andere Tipps
Sie sollten wahrscheinlich die Registrierung für eine JDK-Installation-Adresse suchen.
Als Alternative finden Sie unter dieser Diskussion.
Für 64-Bit-Betriebssystem (Windows 7), der Registrierungsschlüssel unter
sein kann HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Java Development Kit
Wenn Sie einen 32-Bit-JDK. Also, wenn Sie alle geschriebenen Code haben auf dem obigen basiert, gehen Sie den Test erneut.
Ich habe noch nicht hätte meinen Kopf vollständig um die Microsoft Registry Umleitung / Reflexion Sachen noch.