【问题标题】:How to set an environment variable in Java using exec? [duplicate]如何使用 exec 在 Java 中设置环境变量? [复制]
【发布时间】:2012-01-26 07:02:58
【问题描述】:

可能重复:
How do I set environment variables from 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 似乎始终为空,这意味着它可能没有正确设置。

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

有什么想法吗?

【问题讨论】:

    标签: java environment-variables runtime.exec java-6


    【解决方案1】:

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

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

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

    【讨论】:

    • setProperty 只会在您的 JVM 的当前实例级别上创建一个属性。它不会以任何方式用于其他应用程序。
    【解决方案2】:

    有重载的 exec 方法,您可以在其中包含一组环境变量。例如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 task 从 Ant(如您在 cmets 到 aix 中提到的)创建进程,则可以使用嵌套的 env 元素将环境变量传递给子进程,例如

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

    【讨论】:

      【解决方案3】:

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

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

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

      检查设置是否有效的唯一方法是启动一个小批量脚本,在其中设置并在一个进程中进行检查。

      【讨论】:

        【解决方案4】:

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

        你真正想要达到什么目的?

        【讨论】:

        • 有没有办法解决这个问题?我想设置环境变量,然后再使用它(在 Ant 启动的另一个进程中)
        • @James.Elsey:在这种情况下,您必须在启动 ant 之前或从 ant 自身内部设置变量。您将无法从 ant 的子进程更改变量并以某种方式使其对 ant 的另一个子进程可见。
        • @James,如果你从 Ant 启动一个进程,那么你有机会在那个时候在那个进程中设置环境变量(当你从 Ant 执行它时)。
        猜你喜欢
        • 1970-01-01
        • 2015-02-23
        • 2011-12-11
        • 2018-09-04
        • 1970-01-01
        • 1970-01-01
        • 2018-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多