Comment trouver javac.exe par programme?
-
06-07-2019 - |
Question
J'appelle javac depuis le code C #. À l'origine, je n'ai trouvé son emplacement que comme suit:
protected static string JavaHome
{
get
{
return Environment.GetEnvironmentVariable("JAVA_HOME");
}
}
Cependant, je viens d'installer le JDK sur un nouvel ordinateur et j'ai constaté qu'il ne définissait pas automatiquement la variable d'environnement JAVA_HOME. Exiger une variable d'environnement est inacceptable dans les applications Windows de la dernière décennie. J'ai donc besoin d'un moyen de rechercher javac si la variable d'environnement JAVA_HOME n'est pas définie:
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;
}
}
La solution
Si vous utilisez Windows, utilisez le registre:
Kit de développement HKEY_LOCAL_MACHINE \ SOFTWARE \ JavaSoft \ Java
Si vous ne l'êtes pas, vous êtes pratiquement bloqué avec des variables env. Vous pourriez trouver ce blog entrée utile.
Édité par 280Z28:
Sous cette clé de registre se trouve une valeur CurrentVersion. Cette valeur est utilisée pour trouver la maison Java à l'emplacement suivant:
HKEY_LOCAL_MACHINE \ LOGICIEL \ JavaSoft \ Kit de développement Java \ {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;
}
Autres conseils
Vous devriez probablement rechercher dans le registre une adresse d'installation JDK.
Vous pouvez également consulter la discussion .
Sous OS 64 bits (Windows 7), la clé de registre peut se trouver sous
. HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ JavaSoft \ Kit de développement Java
si vous utilisez un JDK 32 bits. Donc, si vous avez tous écrit du code basé sur ce qui précède, testez à nouveau.
Je ne suis pas encore complètement à l'aise avec la Redirection de registre Microsoft / réflexion encore pour le moment.