2016-11-29 99 views
1

对于一个项目来自动进行一些突变充分性测试,我试图从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上。

+2

'envp'不变量添加到环境中,它的变量设置环境。除了您指定的变量之外,其他变量都不会在过程中使用。 **你**覆盖PATH。 –

+0

噢,好的。因此,如果我希望它也能够在我给它的目录中执行./all.bash,那么我是否也必须将该目录添加到$ PATH中?像“PATH =/usr/bin:$ HOME/Desktop/go/src”?或者类似的东西,导致相同的错误。 – user1914745

+0

可能最简单的就是让你的路径通过'System.getenv()。get(“PATH”)' –

回答

0

十二年前,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(); 
相关问题