我正在尝试设置一个环境变量,并将其读回以验证它是否已实际设置。
我有以下内容:
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声明它可以将字符串参数作为命令。
有什么想法吗?
答案 0 :(得分:16)
有重载的exec方法,您可以在其中包含一组环境变量。例如exec(String command, 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)进程中。
同样,如果您使用exec task从Ant创建流程(正如您在注释中提到的那样),那么您可以使用嵌套的env
元素将环境变量传递给子流程,例如
<exec executable="whatever">
<env key="FOO" value="false"/>
</exec>
答案 1 :(得分:2)
这不起作用。当您启动新流程时,该流程会收到环境的副本。它对环境变量所做的任何更改都是在该副本中进行的,并且调用者在任何时候都不会看到它。
你到底想要实现什么目标?
答案 2 :(得分:1)
通过运行“cmd.exe”,您启动一个新进程,它接收新的环境变量,但是java进程没有以这种方式设置新的环境变量。
在Unix / Windows中,每个进程都有自己的一组环境变量,并在进程创建期间从其父进程继承环境变量。
System.getenv()只返回启动进程时设置的环境变量,据我所知,无法更改java进程本身的环境变量。
您可以检查设置是否有效的唯一方法是启动您设置的小批量脚本并在一个过程中执行检查。
答案 3 :(得分:0)
它是null因为你启动了另一个cmd.exe:它与你的Java应用程序的环境不同(参见aix答案)。
我不认为Java运行时可以更改环境变量:它可以读取它们,但不能更改它们。
如果要更改执行JVM中可用的系统属性,请使用System.setProperty(String key,String value“)。