Не удается получить доступ к переменным среды с помощью исполняемой среды выполнения

Я пытаюсь запустить несколько команд .bat, используя Runtime exec (Java). Проблема в том, что после установки переменных среды я не могу использовать эти переменные.

Runtime rt = Runtime.getRuntime();
Process pr;
pr = rt.exec("cmd.exe /c echo %JAVA_HOME%");
InputStream is;
InputStreamReader isr;
BufferedReader reader ;
String line;
is = pr.getInputStream();
isr = new InputStreamReader(is);
reader = new BufferedReader(isr);

while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
pr.getOutputStream().close();`

JAVA_HOME не возвращает фактический путь env.


person user2640248    schedule 13.08.2013    source источник
comment
У меня это отлично работает, как именно вы пытаетесь запустить этот код? Используете ли вы Eclipse или любой другой инструмент с графическим интерфейсом для запуска? Можете ли вы показать мне вывод команды cmd.exe /c echo %JAVA_HOME% из командной строки?   -  person Xinus    schedule 13.08.2013
comment
Можете ли вы поделиться кодом, который вы используете в своих файлах bat?   -  person morgano    schedule 13.08.2013
comment
@Xinus Я спрашивал ОТ, а не тебя ;-)   -  person morgano    schedule 13.08.2013
comment
о.. удалил комментарий :)   -  person Xinus    schedule 13.08.2013
comment
Прочтите (и выполните) все рекомендации Когда Runtime.exec() не будет. Это может решить проблему. Если нет, он должен предоставить дополнительную информацию о причине сбоя. Затем не обращайте внимания на то, что он ссылается на exec, и создайте Process, используя ProcessBuilder. Также разбейте String arg на String[] args для учета аргументов, которые сами содержат пробелы.   -  person Andrew Thompson    schedule 13.08.2013


Ответы (1)


Код работал отлично для меня,

try {
            Runtime rt = Runtime.getRuntime();
            Process pr;
            pr = rt.exec("cmd.exe /c echo %JAVA_HOME%");
            InputStream is;
            InputStreamReader isr;
            BufferedReader reader;
            String line;
            is = pr.getInputStream();
            isr = new InputStreamReader(is);
            reader = new BufferedReader(isr);

            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            reader.close();
            pr.getOutputStream().close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Если это не работает для вас,

  1. убедитесь, что у вас правильно определена переменная среды %JAVA_HOME%. Запустите командную строку и поделитесь выводом cmd.exe /c echo %JAVA_HOME%
  2. Используете ли вы какую-либо IDE для запуска программы?
person Xinus    schedule 13.08.2013
comment
вывод команды cmd.exe /c echo %JAVA_HOME% из командной строки возвращает C:\Program Files\Java\jdk1.7.0_25\, однако при выполнении из Eclipse IDE с использованием вышеуказанного кода он возвращается как %JAVA_HOME% (эхо имя переменной) - person user2640248; 14.08.2013
comment
Замечено, что некоторые переменные env не возвращаются, в том числе JAVA_HOME и другие настраиваемые переменные env. Однако переменные env, такие как USERNAME, PATH, DIR, TEMP, возвращаются с правильным значением. ПРИМЕЧАНИЕ. Войдите в систему как администратор. - person user2640248; 14.08.2013
comment
Я попытался прочитать доступные переменные env в Eclipse IDE с помощью команды rt.exec(cmd.exe /c SET) и заметил, что не все переменные env, показанные в системных свойствах, перечислены в данном выводе. Однако та же команда, выполняемая из командной строки, перечисляет все переменные env. - person user2640248; 14.08.2013
comment
Похоже, что eclipse не наследует все переменные среды, вы можете попробовать несколько вещей: 1. Попробуйте запустить eclipse из командной строки, перейдя в каталог eclipse и проверьте, может ли он распознать env, 2. Явно установите JAVA_HOME в конфигурация запуска eclipse (запустить как->Выполнить конфигурацию->Среда->кнопка [Добавить]) - person Xinus; 14.08.2013
comment
Совершенно верно, после перезапуска eclipse все переменные env сохраняются. Мое требование состоит в том, чтобы мой тест запускал файл .bat, который устанавливал пользовательскую переменную env и использовал эту переменную env во всей программе. Итак, как бы я сделал это возможным ?? ПРИМЕЧАНИЕ. Даже если я запускаю файл .bat из командной строки, для эффективной работы переменной env требуется новое приглашение cmd. - person user2640248; 16.08.2013
comment
Я предполагаю, что ваш bat-файл установит всю необходимую среду и запустит вашу программу? да, вы можете это сделать. вам не требуется командная строка для запуска этого файла bat, вы можете напрямую запустить его из проводника Windows, дважды щелкнув файл bat. - person Xinus; 16.08.2013
comment
как это сделать программно?? Я хочу, чтобы это было автоматизировано, вызывая .bat и используя переменные env в последующих тестах. - person user2640248; 16.08.2013
comment
Невозможно обновить среду напрямую, но вы все же можете обратиться к ответу от pushy stackoverflow.com/questions/318239/ - person Xinus; 17.08.2013