Java processbuilder和使用环境变量
作者:互联网
我想做的是我想运行一个流程,但是因为该流程本身依赖于环境变量,所以直接调用它会导致流程内的错误.对于那些想知道这是什么的人,它是耙工具.因此,我认为使用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()行,并尝试在其中回显$GEM_HOME,它不打印任何内容,如果我在操作系统bash上执行此操作,那么我会得到路径,我还尝试了其他常见的操作,例如echo $SHELL并以Java代码和bash格式打印外壳位置.
所以我的问题是:
1)为什么我的操作系统的环境变量与ProcessBuilder.environment()方法不同?
2)Process类是否考虑使用ProcessBuilder.environment()给出的环境变量?如果是这样,我们如何从操作系统级别添加缺失的?
解决方法:
1)您在Java进程中看到的变量是从您从中启动Java进程的过程继承的变量.即如果从外壳启动它,它应该具有与外壳相同的变量.您需要在启动Java应用程序之前调查实际设置了哪些变量,以及为什么未在该上下文中设置您期望的变量.
要回答第2部分,是的,该过程将与ProcessBuilder.environment()中的环境一起启动.您可以简单地将内容添加到由ProcessBuilder.environment()返回的地图中,这将扩展运行时环境:
ProcessBuilder pb = new ProcessBuilder("foo");
pb.environment().put("MY_VAR", "foobar");
标签:processbuilder,environment-variables,linux,java,process 来源: https://codeday.me/bug/20191120/2042356.html