it-swarm.com.ru

Как установить переменную среды в Java, используя exec?

Возможный дубликат:
Как установить переменные окружения из Java?

Я пытаюсь установить переменную окружения и прочитать ее обратно, чтобы убедиться, что она действительно установлена.

У меня есть следующее:

import Java.io.IOException;

public class EnvironmentVariable
{
    public static void main(String[] args) throws IOException
    {
        Runtime.getRuntime().exec("cmd.exe set FOO=false");

        String s = System.getenv("FOO");
        System.out.println(s);
    }
}

Тем не менее, похоже, что FOO всегда имеет значение null, что означает, что он, вероятно, установлен неправильно.

У меня правильная команда exec? Javadocs заявляет, что может принимать строковый аргумент в качестве команды.

Есть идеи?

8
Jimmy

Это не сработает. Когда вы запускаете новый процесс, этот процесс получает копию среды. Любые изменения, которые он затем вносит в переменные окружения, вносятся в эту копию и ни в коем случае не становятся видимыми для вызывающей стороны.

Чего вы на самом деле пытаетесь достичь?

2
NPE

Существуют перегруженные методы exec, в которые можно включить массив переменных среды. Например exec (команда String, String [] envp) .

Вот пример (с доказательством) установки переменной env в дочернем процессе, который вы выполняете:

public static void main(String[] args) throws IOException {

    String[] command = { "cmd", "/C", "echo FOO: %FOO%" };
    String[] envp = { "FOO=false" };

    Process p = Runtime.getRuntime().exec(command, envp);
    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String s = reader.readLine();
    System.err.println(s);
}

Однако это устанавливает переменную в env созданного процесса, а не вашего текущего (Java) процесса.

Точно так же, если вы создаете процесс из Ant (как вы упомянули в комментариях к aix), используя exec task , то вы можете передать переменные окружения дочернему процессу, используя вложенные элементы env, например,.

<exec executable="whatever">
   <env key="FOO" value="false"/>
</exec>
16
sudocode

Запустив "cmd.exe", вы запускаете новый процесс, который получает новую переменную среды, однако процесс Java не получает эту новую переменную среды, установленную таким образом.

В Unix/Windows каждый процесс имеет свой собственный набор переменных среды и наследует переменные среды от своего родителя при создании процесса.

System.getenv () возвращает только те переменные окружения, которые были установлены при запуске процесса, насколько я вижу, что невозможно изменить переменные окружения самого процесса Java.

Единственный способ проверить, работает ли набор, - запустить небольшой пакетный скрипт, в котором вы установили и выполнили проверку в одном процессе.

1
centic

Это пустое значение, потому что вы запускаете другой cmd.exe: это среда, отличная от среды вашего приложения Java (см. Ответ aix).

Я не думаю, что среда выполнения Java может изменить переменную среды: она может читать их, но не может их изменять.

Если вы хотите изменить системное свойство, доступное в вашей исполняемой JVM, используйте System.setProperty (String key, String value ").

0
Jean-Philippe Briend