Java processbuilder 和使用环境变量

Sar*_*aya 4 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我知道这是与环境相关的问题,因为我收到的错误描述为无法加载此类文件--bundler/setup (LoadError)

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

所以我的问题是:

1)为什么我的操作系统的环境变量与ProcessBuilder.environment()方法不同?

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

K E*_*son 6

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

回答第 2 部分,是的,该进程将在ProcessBuilder.environment(). 您可以简单地将内容添加到 返回的映射中ProcessBuilder.environment(),这将扩展运行时环境:

ProcessBuilder pb = new ProcessBuilder("foo");
pb.environment().put("MY_VAR", "foobar");
Run Code Online (Sandbox Code Playgroud)