如何在Java中添加环境变量?

如何在Java中添加环境变量?,java,Java,可能重复: 我正在研究Java。我必须在java编程代码中添加一个环境变量,以便在使用process builder获取列表时可以使用该变量,如下所示: import java.util.Map; import java.util.Set; class helloworld { public static void main(String[] args) { ProcessBuilder pb = new ProcessBuilder("export MY_ENV

可能重复:

我正在研究Java。我必须在java编程代码中添加一个环境变量,以便在使用process builder获取列表时可以使用该变量,如下所示:

import java.util.Map;
import java.util.Set;

class helloworld  {
    public static void main(String[] args) {

        ProcessBuilder pb = new ProcessBuilder("export MY_ENV_VAR=1");

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

        Set<String> keys = envMap.keySet();
        for(String key:keys){
            System.out.println(key+" ==> "+envMap.get(key));
        }

    }
}
import java.util.Map;
导入java.util.Set;
类helloworld{
公共静态void main(字符串[]args){
ProcessBuilder pb=new ProcessBuilder(“导出我的环境变量=1”);
Map envMap=pb.environment();
Set keys=envMap.keySet();
用于(字符串键:键){
System.out.println(key+“==>”+envMap.get(key));
}
}
}
但通过上述试验,我无法正确获得环境变量。 那么如何设置环境变量呢

 Map<String, String> env = pb.environment();
 env.put("MV_ENV_VAR", "1");
export
将仅由shell解释

另见

一个完整的例子:

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

    ProcessBuilder pb = new ProcessBuilder("CMD", "/C", "SET");
    Map<String, String> env = pb.environment();
    env.put("MYVAR", "myValue");
    Process p = pb.start();
    InputStreamReader isr = new InputStreamReader(p.getInputStream());
    char[] buf = new char[1024];
    while (!isr.ready()) {
        ;
    }
    while (isr.read(buf) != -1) {
        System.out.println(buf);
    }
}

这将证明所创建的流程使用的是受控环境。

您可以使用process Builder对象获取环境变量:

    ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
    Map<String, String> env = pb.environment();
    env.put("VAR1", "myValue");
    env.remove("OTHERVAR");
    env.put("VAR2", env.get("VAR1") + "suffix");
ProcessBuilder pb=newprocessbuilder(“myCommand”、“myArg1”、“myArg2”);
Map env=pb.environment();
环境看跌期权(“VAR1”、“myValue”);
环境移除(“其他变量”);
环境put(“VAR2”,环境get(“VAR1”)+“后缀”);

您可以将所需的变量直接添加到
ProcessBuilder.environment()
map中。 下面的代码应该有效:

import java.util.Map;
import java.util.Set;

class helloworld  {
public static void main(String[] args) {

    ProcessBuilder pb = new ProcessBuilder("/bin/sh"); // or any other program you want to run

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

    envMap.put("MY_ENV_VAR", "1");
    Set<String> keys = envMap.keySet();
    for(String key:keys){
        System.out.println(key+" ==> "+envMap.get(key));
    }

}
import java.util.Map;
导入java.util.Set;
类helloworld{
公共静态void main(字符串[]args){
ProcessBuilder pb=new ProcessBuilder(“/bin/sh”);//或任何其他要运行的程序
Map envMap=pb.environment();
put(“我的环境变量”,“1”);
Set keys=envMap.keySet();
用于(字符串键:键){
System.out.println(key+“==>”+envMap.get(key));
}
}
}来自

减轻负担的一种可能的方法是找出一种方法

void setUpEnvironment(ProcessBuilder builder) {
    Map<String, String> env = builder.environment();
    // blah blah
}
void设置环境(ProcessBuilder){
Map env=builder.environment();
//废话
}
并在启动前将任何
ProcessBuilders
传递给它


另外,您可能已经知道这一点,但可以使用相同的
ProcessBuilder
启动多个进程。因此,如果您的子流程相同,则无需反复进行此设置。

您是否尝试过
pb.environment().put(“key”、“value”)
?@berry120这是个玩笑,但我没有得到确切的答案。
java.lang.UnsupportedOperationException位于java.util.Collections$UnmodifiableMap.put(Collections.java:1457)br.com.stilingue.services.remove_ocationTest.setUpTestEnv(removeCocationTest.java:29)
谢谢,但是env.put(“MV_env_VAR”,“1”);将仅在局部变量中设置env变量,但如果您再次获取processbuilder实例并获取map的内容,它将不会显示您提到的我们已设置的变量。@BSalunke更新了我的答案并添加了一个示例。@masksim_khokhlov如果我们再次获取processbuilder实例并获取map的内容会怎么样?它不会包含我们的variable@BSalunke为什么不会呢?会的!ProcessBuilder.environment()将始终返回相同的
Map
实例。看看这本书。
import java.util.Map;
import java.util.Set;

class helloworld  {
public static void main(String[] args) {

    ProcessBuilder pb = new ProcessBuilder("/bin/sh"); // or any other program you want to run

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

    envMap.put("MY_ENV_VAR", "1");
    Set<String> keys = envMap.keySet();
    for(String key:keys){
        System.out.println(key+" ==> "+envMap.get(key));
    }

}
void setUpEnvironment(ProcessBuilder builder) {
    Map<String, String> env = builder.environment();
    // blah blah
}