2014-12-26 3 views
0

Я хочу установить переменную среды в JAVA. Для этого я много искал в Интернете и получил следующий код.Как установить переменную среды в java

void set_up_environment_var() throws IOException 
{ 
    ProcessBuilder pb = new ProcessBuilder("CMD.exe", "/C", "SET"); // SET prints out the environment variables 
    pb.redirectErrorStream(true); 

    Map<String,String> env = pb.environment(); 

    String str1 = ";C:\\naved\\bin"; 
    String path = env.get("Path") ;//+ ";C:\\naved\\bin"; 
    System.out.println("ok , I am coming . "+path.toLowerCase().contains(str1.toLowerCase())); 
    env.put("Path", path.concat(str1)); 
    Process process = pb.start(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    String line; 
    while ((line = in.readLine()) != null) 
    { 
    //  System.out.println(line); 
    } 
} 

Но после выполнения переменная envorinment не установлена ​​в «PATH» varaible. Зачем ?

+0

Что вы получаете в этом? –

+0

Окружающая среда в ОС не является глобальным пространством, она является локальной для процесса выполнения. Когда процесс начинается с другого, среда нового процесса наследуется от родителя. Вы никогда не сможете изменить среду родителя из подпроцесса. – Henry

+0

Для этого у вас будут грязные руки на родном уровне через JNI/JNA – MadProgrammer

ответ

1

Простой пример, как установить путь с setx.exe в командной строке:

setx path "jdk bin path" 

экс

setx path "C:\Program Files (x86)\Java\jdk1.7.0_04\bin" 

попробовать это на свой код

как

try { 

     // using the Runtime exec method: 
     Process p = Runtime.getRuntime().exec("setx path C:\Program Files (x86)\Java\jdk1.7.0_04\bin"); 

     BufferedReader stdInput = new BufferedReader(new 
      InputStreamReader(p.getInputStream())); 

     BufferedReader stdError = new BufferedReader(new 
      InputStreamReader(p.getErrorStream())); 

     // read the output from the command 
     System.out.println("Here is the standard output of the command:\n"); 
     while ((s = stdInput.readLine()) != null) { 
      System.out.println(s); 
     } 

     // read any errors from the attempted command 
     System.out.println("Here is the standard error of the command (if any):\n"); 
     while ((s = stdError.readLine()) != null) { 
      System.out.println(s); 
     } 

     System.exit(0); 
    } 
    catch (IOException e) { 
     System.out.println("exception happened - here's what I know: "); 
     e.printStackTrace(); 
     System.exit(-1); 
    } 
+0

Я объяснил это более ясно здесь: http://stackoverflow.com/questions/1672281/environment-variables-for-java-installation/31340459#31340459 – hitesh141

4

Процесс может устанавливать только envi и для процессов, которые он будет появляться в будущем. Процесс не может устанавливать переменные среды уже запущенных процессов.

Возможно, вы уже заметили, что при настройке переменных среды вручную, глобально в системе. Они не будут влиять на экземпляры процессов, которые уже запущены, например, уже запущенный cmd.exe или уже запущенный bash. Возможно, вы также заметили, что если вы установите таким образом переменную окружения, то, независимо от того, будет ли новый процесс получать новую переменную среды, зависит от того, как запускается новый процесс. Поведение по умолчанию заключается в том, что процесс запускается с копией среды его родительского процесса, который является процессом, который запускает новый процесс.

Как простое объяснение, вы можете сказать, что есть корневые процессы и дочерние процессы. корневые процессы получают параметры среды из глобальных параметров, дочерние процессы наследуют параметры среды от своих родительских процессов.

Вопрос в том, чего вы хотите достичь, установив среду? Я мог бы подумать, по крайней мере, о трех разных вещах, которые вы могли бы достичь:

  • Установите среду в глобальном масштабе, как часть установщика.
  • Установите среду для текущей JVM.
  • Задайте среду для процесса, который вы начнете.
  • Задайте среду для вызывающего процесса напрямую (не возможно!).
  • Коснитесь окружающей среды для вызывающего процесса.

Настройка среды в глобальном масштабе, как часть инсталлятора

Это очень конкретной системы. В UNIX эту тему фактически избегают. Программы скорее предоставят сценарии-оболочки, которые устанавливают среду вместо установки глобальных переменных окружения. Философия в UNIX заключается в том, что обычно переменные среды используются только в тех случаях, когда переменная будет полезна не только для одного процесса. Примерами таких переменных являются PATH и EDITOR.

В Windows вы, вероятно, звоните regedit, чтобы изменить окружающую среду.

Установка среды в настоящее время работает JVM

Там нет API для настройки среды в настоящее время работает JVM, поэтому вам придется использовать JNI для этого. Тем не менее, имейте в виду, что тот факт, что для этого нет API, по уважительным причинам, и часть этих причин может заключаться в том, что JVM не хочет, чтобы его среда была произвольно изменена некоторым кодом Java.

Настройка среды для процесса, который будет запущен

При запуске процесса с использованием один из Runtime.exec() методов, вы можете обеспечить среду, которая вам нравится.

Если вы хотите начать процесс с измененной среды, лучшим способом было бы использовать ProcessBuilder. Он предоставляет метод environment() для изменения среды для нового процесса.

Настройка среды для вызывающего процесса непосредственно

Если вы хотите реализовать команду set в Java, забыть, это не представляется возможным. set не является программой, это внутренняя команда оболочки, то есть cmd.exe. Из-за объяснения выше, это не будет работать иначе.

Настройка среды для вызывающего процесса косвенно

Вы можете установить условия для вызывающего процесса косвенно - если вызывающий процесс взаимодействует. Если ваш вызывающий процесс равен cmd.exe или sh, вы могли бы заставить вашу программу Java генерировать временный командный файл или сценарий оболочки, а затем вызвать вызывающий cmd.exe или sh выполнение командного файла или сценария оболочки.

Смежные вопросы