java #processbuilder
#java #processbuilder
Вопрос:
https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html
Предположим, что программа Java (скажем, my.jar ) использует ProcessBuilder для запуска подпроцесса.
Если я начну программу с VAR=xxx java -jar my.jar
, будет ли подпроцессу известно, что для переменной среды VAR установлено значение xxx?
Комментарии:
1. Вы пробовали это? Что вы обнаружили?
2. Мой вывод не известен. Но я хочу подтвердить.
3. Может
export VAR=xxx
быть, работает.4. Это сильно зависит от того, как именно вы используете ProcessBuilder. Вы взглянули на
environment()
функцию ProcessBuilder?5. ОК. Это объясняет, что я не вижу, чтобы переменная env передавалась от родительского процесса к дочерним процессам. Есть ли какие-либо другие вещи, которые могут помешать родительским переменным env отображаться в дочерних процессах?
Ответ №1:
Переменные будут переданы, если они установлены правильно, в зависимости от вашей ОС и командной оболочки.
В Windows используйте set VAR=xyz
или редактируйте переменные среды в настройках. Для bash на GNU / Linux export VAR=xyz
. Эти переменные должны быть переданы процессу Java и любому подпроцессу, вызываемому с ProcessBuilder
помощью .
Обратите внимание, что вы также можете изменить настройки среды подпроцесса, изменив значения environment()
before start()
.
В GNU / Linux с bash
объявлением локальной переменной, такой как VAR=XYZ
, не всегда передается процессу или подпроцессу java. Например, VAR2 здесь передается приложению Java, но не VAR1 — но передает оба значения, если первая строка изменена на export VAR1=123
:
VAR1=123
VAR2=456 java -jar xyz.jar
Комментарии:
1. ОК. Это объясняет, что я не вижу, чтобы переменная env передавалась от родительского процесса к дочерним процессам. Есть ли какие-либо другие вещи, которые могут помешать родительским переменным env отображаться в дочерних процессах? Я хотел бы получить исчерпывающий список.
2. Я предлагаю вам отредактировать свой вопрос, указав подробную информацию о том, что вы делаете в данный момент, и что вы хотите видеть внутри вашего Java-процесса и подпроцесса. Если вы не видите свою переменную, то вы, вероятно, не экспортировали значение, и
environment()
это может быть лучшим способом управления переменными в подпроцессе.3. Исходная проблема связана с большим программным обеспечением, которое я не могу легко изолировать от проблемы. Таким образом, я просматривал документ java, который в данном случае просто беспомощен. Вот почему я хочу знать все ситуации, которые препятствуют передаче env var дочерним процессам.
4. В вашем вопросе должна быть указана ОС, как вы устанавливаете переменную, как вы затем вызываете свое Java-приложение, значение переменной внутри вашего Java-приложения, как вы вызываете подпроцесс и, в идеале, значение переменной внутри вашего подпроцесса.
5. Java не зависит от операционной системы. Таким образом, ОС не имеет значения. Я уже упоминал, как я устанавливаю переменную и как я вызываю свое Java-приложение. Конкретное значение не имеет значения, поскольку я задаю вопрос в общем виде. Подпроцесс вызывается через ProcessBuilder, есть ли несколько способов вызвать ProcessBuilder?