11

可能重复:
如何从 Java 设置环境变量?

我正在研究Java。我必须在 java 代码编程中添加一个环境变量,这样当我使用进程构建器获取列表时它就可用,如下所示:

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));
        }

    }
}

但是通过上述试验,我无法正确获取环境变量。那么如何设置环境变量呢?

4

4 回答 4

9
 Map<String, String> env = pb.environment();
 env.put("MV_ENV_VAR", "1");

将设置 MY_ENV_VAR=1。在您通过以下方式调用流程之前

Process p = pb.start();

export只会被shell解释。

另请参见ProcessBuilder

一个完整的例子:

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);
    }
}

在其他环境值中打印:

MYVAR=myValue

这应该证明创建的进程使用了​​被操纵的环境。

于 2013-01-18T12:43:08.497 回答
5

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

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));
    }

}

}

于 2013-01-18T12:45:31.953 回答
3

您可以使用流程 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");
于 2013-01-18T12:45:27.847 回答
1

how-do-i-set-environment-variables-from-java

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

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

ProcessBuilders在启动它们之前通过它。

此外,您可能已经知道这一点,但您可以使用相同的ProcessBuilder. 因此,如果您的子流程相同,则无需一遍又一遍地进行此设置。

于 2013-01-18T12:50:02.573 回答