Я пытаюсь получить java.exe
путь установки на Windows. Тем не менее, я не могу добиться успеха до сих пор.
То, что я пробовал, это:
getenv("JAVA_HOME")
, который редко устанавливается на мой взгляд (в основном ничего не возвращает, так как он не установлен?)for %i in (java.exe) do @echo. %~$PATH:i
, который возвращает мне путь при выполнении вручную в CMD, однако я не могу получить его программно в C ++? _popen
ничего не возвращает мне, когда я выполняю этот код, однако простой dir
оператор возвращает мне правильный вывод (список каталогов).Итак, все, что я хочу, это найти путь, по которому java.exe
находится, что мне нужно в моем приложении. Пожалуйста, если у вас есть хорошие идеи, дайте мне знать. Я готов исправить эту проблему.
string cmd(char *command) {
FILE *fpipe;
string response = "";
char c = 0;
if (0 == (fpipe = (FILE*)_popen(command, "r"))) {
Exit("popen() failed.");
}
while (fread(&c, sizeof c, 1, fpipe)) {
//printf("%c", c);
response += c;
}
_pclose(fpipe);
return response;
}
cout << cmd("for %i in (java.exe) do @echo. %~$PATH:i") << endl; //EMPTY (MANUAL ON CMD RETURNS THE RIGHT PATH)
cout << cmd("dir"); //RETURNS LIST OF CONTENTS
Если вы хотите, чтобы ваше приложение работало на самых разных машинах, вы не можете предполагать какие-либо фиксированные пути и обычно не можете предполагать, что установлены определенные переменные среды. Пользователь почти всегда может выбрать совершенно произвольное место установки. Чаще всего единственный достаточно надежный способ получить информацию о месте установки программы — через реестр Windows. И даже это предполагает установку через установщик, который фактически записывает эту информацию в реестр.
Для Oracle Java Runtime вся необходимая информация хранится в реестре при условии, что она была установлена с собственным установщиком.
Соответствующие пути реестра зависят от типа Java и типа Windows.
64-битная Java на 64-битной Windows или 32-битная Java на 32-битной Windows:
HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
32-битная Java на 64-битной Windows:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Java Runtime Environment
Этот ключ имеет запись Текущая версия который содержит новейший установленный номер версии. Он также имеет несколько вложенных ключей, по крайней мере, один для каждой установленной версии Java Runtime. Эти ключи имеют запись JAVAHOME содержит каталог установки Java верхнего уровня. Я не слишком знаком с Java, но я предполагаю, что начиная с этого места, расположение каталога и файлов фиксировано, так что вы можете предположить, что java.exe всегда можно найти по одному и тому же пути относительно JAVAHOME.
Для большей ясности предположим, что у вас установлена версия 1.8.0_111 в качестве самой новой версии.
У вас будет два подраздела для этой версии.
...\Java Runtime Environment\1.8
...\Java Runtime Environment\1.8.0_111
Оба подраздела будут иметь JAVAHOME запись, указывающая на каталог установки, например: «C: \ Program Files (x86) \ Java \ jre1.8.0_111».
Вы могли бы использовать WinAPI непосредственно. Для вашей простой задачи запросить несколько ключей, которые могут быть даже разумными. Существует также целый ряд библиотек, которые обертывают WinAPI и дают вам более похожий на C ++ интерфейс для функций реестра WinAPI. Я не использовал ни одного из них, поэтому я не могу рекомендовать один.
С помощью JAVA_HOME
некоторое время устарела, поэтому любое решение, которое вы используете с этой переменной, будет устаревать.
Если Java была установлена с использованием стандартного установщика Oracle, то %ProgramData%\Oracle\Java\javapath\java.exe
должна быть ссылка на текущий лаунчер. И это реальная ссылка, а не «ненадежный ярлык Windows», дрянная фальшивая symlink-wannabe, так что вы можете просто использовать этот путь напрямую (во всяком случае, после получения переменной среды ProgramData). javapath
часть, где происходит какое-то волшебство NTFS с жесткими ссылками / переходами, особенно для того, чтобы его можно было добавить к $PATH
вместо того, чтобы постоянно возиться с обновлением «Java / jre-X.Y.Z / bin» и тому подобным.
Если Java была установлена каким-либо другим способом — например, «Сервер JRE», который намеренно не имеет установщика и может быть помещен в любое место, где у вас есть разрешения на запись, — тогда вам придется возиться с этим трюком $ PATH в CMD. Я понятия не имею, почему popen не будет работать, кроме того, что Windows снова делает свое дело, вместо того, чтобы просто следовать стандарту POSIX (именно поэтому мой офис в значительной степени отказался от написания кода непосредственно в Windows).