Как мне найти javac.exe программно?
-
06-07-2019 - |
Вопрос
Я звоню в 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 еще не выполнено.