如何使用exec在Java中设置环境变量?

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

我正在尝试设置一个环境变量,并将其读回以validation它是否已实际设置。

我有以下内容:

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始终为空,这意味着它可能未正确设置。

我的exec命令是否正确? javadocs声明它可以将一个字符串参数作为命令。

有任何想法吗?

这不行。 当您启动新进程时,该进程将收到环境的副本 。 然后,它对环境变量所做的任何更改都在该副本中进行,并且调用者在任何时候都不会看到它。

你究竟想要实现什么目标?

有重载的exec方法,您可以在其中包含一组环境变量。 例如exec(String command,String [] envp) 。

这是一个示例(有certificate)在你执行的子进程中设置一个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)进程的env中。

类似地,如果您使用exec任务从Ant创建进程(正如您在注释中提到的那样),那么您可以使用嵌套的env元素将环境变量传递给子进程,例如

    

通过运行“cmd.exe”,您将启动一个新进程,该进程接收新的环境变量,但java进程不会以这种方式设置新的环境变量。

在Unix / Windows中,每个进程都有自己的一组环境变量,并在进程创建期间从其父进程inheritance环境变量。

System.getenv()只返回启动进程时设置的环境变量,据我所知,无法更改java进程本身的环境变量。

检查集合是否有效的唯一方法是启动一个小批处理脚本,在此处设置并在一个进程中执行检查。

它是null因为您启动了另一个cmd.exe:它与您的Java应用程序的环境不同(参见aix答案)。

我不认为Java运行时可以更改环境变量:它可以读取它们,但不能更改它们。

如果要更改执行JVM中可用的系统属性,请使用System.setProperty(String key,String value“)。