2016-11-29 1 views
1

Für ein Projekt zur Automatisierung einiger Mutationsadäquatheitstests versuche ich, GoLang aus der Quelle innerhalb eines Java-Programms zu machen. Ich konnte es von der Quelle in dem Terminal machen, und habe versucht, mit diesem Befehl in Java Runtime.getRuntime() exec() Befehl.

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"); 

Der entsprechende Befehl an das funktioniert im Terminal in Ordnung. Ausführen von Code in Java (und Drucken der Ausgabe) wird der folgende:

./all.bash 
##### Building Go bootstrap tool. 
cmd/dist 
go tool dist: FAILED: uname -r: exec: "uname": executable file not found in $PATH 

Also das ist seltsam, dass es nicht uname finden. Wenn ich 'uname' auf dem Terminal eintrage, funktioniert es einwandfrei. So fand ich das Verzeichnis von uname ('die uname' gibt '/ usr/bin/uname') und Set $ ​​PATH, dass für diesen Befehl:

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"); 

Und das bekommt stattdessen die Ausgabe:

./all.bash 
env: bash: No such file or directory 

Also wenn ich den Pfad festlegen, kann es das Programm im Verzeichnis nicht finden. Dies deutet darauf hin, dass Runtime.getRuntime(). Exec() aufgerufen wird, überschreibt es $ PATH als das Verzeichnis, das ich übergeben habe, und überschreibt dann die Umgebungsvariablen, die ich ihm gegeben habe. Aber damit ./all.bash funktioniert, müssen beide Pfade in der Variablen $ PATH enthalten sein. Wie kann ich das machen?

Unter Mac OS X 10.11.6.

+2

'envp' ist Variablen nicht in die Umwelt hinzuzufügen, es Variablen ist, die Umwelt gesetzt. Andere als die von Ihnen angegebenen Variablen werden dem Prozess nicht zur Verfügung gestellt. ** Sie ** überschreiben PATH. –

+0

Oh ok. Wenn ich möchte, dass es ./all.bash auch in dem Verzeichnis, das ich ihm gebe, ausführen kann, muss ich dieses Verzeichnis zu $ ​​PATH hinzufügen? Wie "PATH =/usr/bin: $ HOME/Desktop/gehen/src"? Oder so etwas, weil das den gleichen Fehler bekommt. – user1914745

+0

Wahrscheinlich am einfachsten, nur Ihren Weg zu bekommen und es durch 'System.getenv(). Get (" PATH ")' –

Antwort

0

Runtime.exec wurde vor 12 Jahren durch ProcessBuilder ersetzt, als Teil von Java 1.5.

Unter seinen vielen überlegenen Eigenschaften ist die Fähigkeit, die bestehenden Umgebung hinzuzufügen:

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(); 
Verwandte Themen