对于一个自动进行一些突变充分性测试的项目,我试图从Java程序内部创建GoLang。我已经能够在终端中从源代码创建它,并尝试在Java的Runtime.getRuntime()。exec()命令中使用该命令:
String[] envp = new String[3];
envp[0] = "CC=/usr/bin/clang";
envp[1] = "GOROOT_BOOTSTRAP=/usr/local/go";
envp[2] = "CGO_ENABLED=0";
Runtime.getRuntime().exec("./all.bash", envp, "$HOME/Desktop/go/src");
对此的等效命令在终端中正常工作。在java中运行此代码(并打印输出)得到以下结果:
./all.bash
##### Building Go bootstrap tool.
cmd/dist
go tool dist: FAILED: uname -r: exec: "uname": executable file not found in $PATH
因此无法找到uname,这很奇怪。再说一次,如果我在终端上输入'uname'就可以了。所以我找到了uname目录('uname'给出'/ usr / bin / uname')并将$ PATH设置为此命令的目录:
String[] envp = new String[4];
envp[0] = "CC=/usr/bin/clang";
envp[1] = "GOROOT_BOOTSTRAP=/usr/local/go";
envp[2] = "CGO_ENABLED=0";
envp[3] = "PATH=/usr/bin";
Runtime.getRuntime().exec("./all.bash", envp, "$HOME/Desktop/go/src");
然后获得输出:
./all.bash
env: bash: No such file or directory
因此,当我设置路径时,它无法在目录中找到该程序。这告诉我,当调用Runtime.getRuntime()。exec()时,它会覆盖$ PATH作为我传递它的目录,然后覆盖我给它的环境变量。但是为了使./all.bash工作,我需要两个路径都在$ PATH变量中。我怎么能这样做?
在Mac OS X 10.11.6上。
答案 0 :(得分:2)
Runtime.exec被ProcessBuilder取代,作为Java 1.5的一部分。
其众多优势功能之一是能够添加到现有环境中:
ProcessBuilder builder = new ProcessBuilder("./all.bash");
builder.inheritIO();
builder.directory(
new File(System.getProperty("user.home") + "/Desktop/go/src"));
builder.environment().put("CC", "/usr/bin/clang");
builder.environment().put("GOROOT_BOOTSTRAP", "/usr/local/go");
builder.environment().put("CGO_ENABLED", "0");
builder.start();