Известно ли ProcessBuilder о переменной среды?

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?