2015-04-14 3 views
2

Я пытаюсь выполнить команду из моего веб-приложения Java (проект maven с Tomcat 8 в Eclipse). Если я выполняю эту команду с помощью строки cmd или файла .jar, проблем нет, но в Eclipse это не работает. Я пробовал ProcessBuilder класс и Runtime.getRuntime().exec(), но оба они выбрали исключение из «исключенного файла».не может запускать команду с processbuilder или runexec внутри eclipse

java.io.IOException: Cannot run program "mongodump": error=2, No such file or directory 

Команда я хочу запустить это:

mongodump --db TweetsDB --collection Tweets --out ./TweetsDB_backup/ 

кажется, что среды выполнения не может найти команду mongodump Любое предложение (и/или папка с именем в команде?) ? Вот это мой код:

public synchronized static void backup(){ 
Process p; 
try { 
    String dateTimeInString = dateTimeToString(Calendar.getInstance()); 
    System.out.println("backuppando "+dateTimeInString); 
    p = Runtime.getRuntime().exec("mongodump --db TweetsDB --collection Tweets --out ./backup/"); //override always the same db to save space 
    p.waitFor(); 
    System.out.println("Backup effettuato correttamente :)"); 
} catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

}

Это "процесс строитель" вариант:

ProcessBuilder builder = new ProcessBuilder("mongodump", "--db", "TweetsDB","--collection", "Tweets", "--out" ,"./TweetsDB_backup/"); 
builder.redirectErrorStream(true); // equivalent of 2>&1 
final Process process = builder.start(); 
InputStream es = process.getErrorStream(); 
InputStreamReader esr = new InputStreamReader(es); 
BufferedReader br = new BufferedReader(esr); 
String line; 
while((line = br.readLine())!= null){ 
    System.out.println(line); 
} 

Спасибо, Джулио

+0

попробовать абсолютный путь к .exe команде; то вы также можете установить 'builder.directory (workDir);' – boly38

ответ

0

Когда вы начали процесс с ProcessBuilder или Runtime.getRuntime(). exec(), он будет проглатывать любой результат процесса, который запускается.

Чтобы увидеть настоящую проблему, вам нужно получить этот выход.

С Runtime.exec() вам необходимо использовать process.getErrorStream() и process.getInputStream() и настроить потоки, чтобы скопировать вывод туда, где вы можете его увидеть.

с ProcessBuilder вы можете diurect IO из полученного процесса в текущие (родительские) процессы с помощью ProcessBuilder.inheritIO() перед вызовом ProcessBuilder.start().

Используйте ProcessBuilder.inheritIO(), чтобы перенаправить выходные процессы на серверный журнал, и вы можете узнать, что такое ошибка.

попробуйте следующее и посмотрите, поможет ли оно.

ProcessBuilder builder = new ProcessBuilder("mongodump", "--db", "TweetsDB","--collection", "Tweets", "--out" ,"./TweetsDB_backup/"); 
builder.inheritIO(); 
final Process process = builder.start(); 

Как только вы знаете, что такое ошибка, вы сможете решить проблему.

Я подозреваю, что вам нужно установить дополнительные переменные среды или что-то в результате процесса, чтобы заставить его работать.

+0

Я снова обновил вопрос и вставил то, что я сделал в варианте ProcessBuilder, исключение возникает в builder.start(), тогда я не могу прочитать поток ошибок из процесса –

0

Я не пробовал еще, но, возможно, вы можете сделать это следующим образом:

Mongo client = new MongoClient(); 
client.getDB("myDb").command("mongodump ..."); 
Смежные вопросы