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;
    }
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top