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

9

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

我试图设置一个环境变量,并读取它以验证实际设置了。

我有以下代码:

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 总是为 null,这意味着它可能没有被正确设置。

我是否正确使用了 exec 命令?javadoc 声明它可以接受一个字符串参数作为命令。

有什么想法吗?

4个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
20

在Java中有多个重载的执行方法可以包含一个环境变量数组。例如exec(String command, String[] envp)

以下是设置子进程中环境变量的示例(并带有证明):

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

然而,这会将变量设置在创建的进程的环境中,而不是您当前(Java)进程的环境中。

同样地,如果您正在使用exec任务从Ant(正如您在对aix的评论中提到的)创建进程,则可以使用嵌套的env元素向子进程传递环境变量,例如:

<exec executable="whatever">
   <env key="FOO" value="false"/>
</exec>

2
这行不通。当你启动一个新的进程时,该进程会接收环境变量的副本。它对环境变量所做的任何更改都是在该副本中进行的,并且在任何时候都不会对调用者可见。 你实际上想要实现什么?

有什么办法可以解决这个问题吗?我想设置环境变量,然后稍后在另一个由Ant启动的进程中使用它。 - Jimmy
在这种情况下,您必须在启动ant之前或从ant本身内部设置变量。您将无法从ant的子进程更改变量,并以某种方式使其对另一个ant的子进程可见。 - NPE
@James,如果你正在从Ant启动一个进程,那么你有机会在该进程中设置环境变量(当你从Ant执行它时)。 - ewan.chalmers

1

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

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

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


setProperty 方法只会在当前 JVM 实例的级别上创建属性,不会以任何方式对其他应用程序可用。 - bvdb

1
通过运行“cmd.exe”,您启动了一个新进程,该进程接收新环境变量,但是java进程不会以这种方式设置新环境变量。 在Unix / Windows中,每个进程都有自己的一组环境变量,并在进程创建期间从其父进程继承环境变量。 System.getenv()仅返回在启动进程时设置的环境变量,据我所见,没有办法更改java进程本身的环境变量。 您唯一可以检查设置是否有效的方法是启动一个小批处理脚本,在其中设置并在一个进程中进行检查。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,