Вопрос

Я звоню в Javac из кода C #. Первоначально я нашел его местоположение только следующим образом:

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

Однако я только что установил JDK на новый компьютер и обнаружил, что он не устанавливает переменную среды JAVA_HOME автоматически. Требование переменной среды недопустимо в любом приложении Windows за последнее десятилетие, поэтому мне нужен способ найти javac, если переменная среды JAVA_HOME не установлена:

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. Вы можете найти этот блог запись полезна.

Под редакцией 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-битной ОС (Windows 7) раздел реестра может находиться в

HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ JavaSoft \ Java Development Kit

если у вас 32-битный JDK. Так что, если вы все написали код, основанный на вышеизложенном, попробуйте снова.

Я еще не совсем понял, что такое Перенаправление / отражение реестра Microsoft еще не выполнено.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top