Java流程构建器和使用环境变量

时间:2015-06-01 13:34:06

标签: java linux process environment-variables processbuilder

我想要做的是我想运行一个进程,但是因为这个进程本身依赖于环境变量,所以直接调用它会导致进程内出错。对于那些想知道这是什么的人来说,它是rake工具。出于这个原因,我想也许最好使用bash并通过bash使用它可以消除这个问题。然而,情况似乎并非如此。

这是我的代码:

public static void runPB(String directory) throws IOException {
        ProcessBuilder processBuilder = new ProcessBuilder(
                "/bin/bash");
        processBuilder.directory(new File(directory));
        Process process = processBuilder.start();
        OutputStreamWriter osw = new OutputStreamWriter(process.getOutputStream());
        osw.write("rake routes");
        osw.close();
        printStream(process.getErrorStream());
        printStream(process.getInputStream());
    }

    public static void printStream(InputStream is) throws IOException {
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    }

我知道这是与环境相关的问题,因为我在这里描述的错误是cannot load such file -- bundler/setup (LoadError)

此外,我检查processBuilder.environment()返回的环境变量少于输入env的环境变量。我继续改变了osw.write()行并在那里尝试了echo $GEM_HOME,它没有打印任何内容,如果我在我的操作系统上执行此操作,那么我就可以获得路径了,我还尝试了其他常见的事情,例如{ {1}}它在Java代码和bash中打印shell位置。

所以我的问题是:

1)为什么我的操作系统的环境变量与echo $SHELL方法不同?

2)ProcessBuilder.environment()类是否考虑使用Process给出的环境变量?如果是,那么我们如何从操作系统的级别添加缺少的?

1 个答案:

答案 0 :(得分:3)

1)您在java进程中看到的变量是从您启动java进程的进程继承的变量。即如果从shell启动它,它应该具有与shell相同的变量。您需要在启动Java应用程序之前调查实际设置的变量,以及为什么未在该上下文中设置您期望的变量。

要回答第2部分,是的,将使用ProcessBuilder.environment()中的环境启动该过程。您可以简单地将内容添加到ProcessBuilder.environment()返回的地图中,这将扩展运行时环境:

ProcessBuilder pb = new ProcessBuilder("foo");
pb.environment().put("MY_VAR", "foobar");