Windows — C ++ программно получить путь java.exe

Я пытаюсь получить java.exe путь установки на Windows. Тем не менее, я не могу добиться успеха до сих пор.

То, что я пробовал, это:

  1. getenv("JAVA_HOME"), который редко устанавливается на мой взгляд (в основном ничего не возвращает, так как он не установлен?)
  2. CMD команда 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

0

Решение

Если вы хотите, чтобы ваше приложение работало на самых разных машинах, вы не можете предполагать какие-либо фиксированные пути и обычно не можете предполагать, что установлены определенные переменные среды. Пользователь почти всегда может выбрать совершенно произвольное место установки. Чаще всего единственный достаточно надежный способ получить информацию о месте установки программы — через реестр Windows. И даже это предполагает установку через установщик, который фактически записывает эту информацию в реестр.

Поиск пути установки JRE в реестре Win

Для 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 в качестве самой новой версии.

  • Ваш Текущая версия вход будет «1.8».
  • У вас будет два подраздела для этой версии.

    ...\Java Runtime Environment\1.8
    ...\Java Runtime Environment\1.8.0_111
    
  • Оба подраздела будут иметь JAVAHOME запись, указывающая на каталог установки, например: «C: \ Program Files (x86) \ Java \ jre1.8.0_111».

Доступ к реестру с C ++

Вы могли бы использовать WinAPI непосредственно. Для вашей простой задачи запросить несколько ключей, которые могут быть даже разумными. Существует также целый ряд библиотек, которые обертывают WinAPI и дают вам более похожий на C ++ интерфейс для функций реестра WinAPI. Я не использовал ни одного из них, поэтому я не могу рекомендовать один.

3

Другие решения

С помощью 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).

2

По вопросам рекламы [email protected]