2009-10-23 6 views
2

J'appelle javac du code C#. Au départ, je trouve sa section comme suit:Comment trouver javac.exe par programme?

protected static string JavaHome 
{ 
    get 
    { 
     return Environment.GetEnvironmentVariable("JAVA_HOME"); 
    } 
} 

Cependant, je viens d'installer le JDK sur un nouvel ordinateur et trouvé qu'il n'a pas mis automatiquement la variable d'environnement JAVA_HOME. nécessitant une variable d'environnement est inacceptable dans toute application Windows pour la dernière décennie, donc je besoin d'un moyen de trouver javac si la variable d'environnement JAVA_HOME n'est pas défini:

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; 
    } 
} 
+3

Pourquoi est-ce inacceptable? Comment l'ordinateur est-il censé savoir magiquement où l'exécutable est installé? Ils ne sont pas des lecteurs d'esprit, ce sont des ordinateurs, vous devez leur dire quoi faire ... – amischiefr

+0

Parce qu'ils ne se synchronisent pas correctement à travers l'environnement, ils sont difficiles à configurer, et j'en ai marre d'avoir à écrire instructions alambiquées aux utilisateurs. –

Répondre

4

Si vous êtes sous Windows, le registre d'utilisation:

HKEY_LOCAL_MACHINE \ SOFTWARE \ JavaSoft \ Java Development Kit

Si vous n'êtes pas, vous êtes un peu coincé avec des variables d'env. Vous pourriez trouver l'entrée de blog this utile.

Edité par 280Z28:

Sous cette clé de Registre est une valeur CurrentVersion. Cette valeur est utilisée pour trouver la maison de Java à l'adresse suivante:
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; 
} 
+0

Pour les utilisateurs de Linux, je suis tombé sur cet exemple de code, qui fait la même chose: http://agiletrack.net/samples/sample-detect-java.html – luvieere

+0

agiletrack.net url ne fonctionne pas, s'il vous plaît envoyer comment detect java_home dans linuc – Udhaya

1

Vous devez rechercher probablement le registre pour un JDK adresse d'installation.

Comme alternative, voir la discussion this.

0

64 bits OS (Windows 7), la clé de Registre peut être sous

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Java Development Kit

si vous utilisez un JDK 32 bits. Donc, si vous avez tous du code écrit basé sur ce qui précède, allez tester à nouveau.

Je n'ai pas encore tout à fait la tête autour de la Microsoft registry redirection/reflection choses pour le moment.

Questions connexes