通过“源代码”从Java代码中设置和获取环境变量

时间:2014-07-25 08:14:19

标签: java linux shell

我正在编写Java控制台应用程序,它从环境变量(Linux)中获取输入参数。要设置这些变量,我的应用程序必须“获取”shell脚本。我可以使用Runtime.exec()或ProcessBuilder来“源”脚本,但我不知道如何访问创建的环境变量。

我的shell脚本(set_env.sh):

#!/bin/csh

setenv MY_DB DB_NAME

上面的脚本有“源代码”的Java代码:

    ProcessBuilder pb = new ProcessBuilder("csh", "-c", "'source set_env.sh'");
    Process p = null;
    try {
        p = pb.start();
        p.waitFor();
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }

如何获取对已创建的MY_DB变量的访问权限,或者我的问题还有其他解决方案吗?

任何帮助将非常感谢。 先感谢您。

好的伙计们。谢谢你的回答。有我的临时解决方案。我写了另一个脚本,使“源”和回声创建变量。在执行它的Java代码中,读取进程的输入流并解析它们。

2 个答案:

答案 0 :(得分:2)

您可以使用System#getenv()System#getenv(String name)访问环境变量。

来自Oracle's tutorial

import java.util.Map;

public class EnvMap {
    public static void main (String[] args) {
        Map<String, String> env = System.getenv();
        for (String envName : env.keySet()) {
            System.out.format("%s=%s%n",
                              envName,
                              env.get(envName));
        }
    }
}

然而,如Sylvain Leroux和Serge Ballesta所述,使用Process#start()创建的子进程无法修改其父项的环境。

如果您的目的只是设置java代码使用的一些变量,那么java Properties可能更适合。

答案 1 :(得分:1)

  

如何获取对已创建的MY_DB变量的访问权限,或者我的问题还有其他解决方案吗?

你不能。当你&#34; source&#34;您的文件,实际上是由您启动的子shell读取的。修改了此子shell的环境。但是环境修改传播回父进程。

  

据我所知,System.env在JVM启动期间初始化,在应用程序生命周期内无法修改。   是和否.Java标准库不提供必要的调用来更改当前环境。但不要以为环境是以某种方式锁定的#34;。这实际上比这更简单:每个进程(shell,JVM实例,其他任何进程)在创建时都会收到其父环境的副本。您可以使用副本执行所需操作,但由于 是副本,因此它与父级环境无关。当您启动新流程时,它会在创建环境时收到环境的副本

截至&#34;失踪&#34;在Java中的setEnv方法,这可能是(?)因为Sun的某个人认为会打破咒语&#34;写一次,到处运行&#34;因为有些系统没有环境变量?见How do I set environment variables from Java?

BTW,如果您需要自定义环境来启动外部流程,您实际上可以使用Runtime.html#exec

的第二个参数构建自己的环境