2016-11-29 5 views
1

Для проекта, чтобы автоматизировать некоторое тестирование адекватности мутаций, я пытаюсь сделать 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();