我正在尝试从Java Web应用程序(Eclipse中具有Tomcat 8的Maven项目)执行命令。
如果我通过cmd行或.jar文件执行此命令,则没有问题,但在Eclipse中不起作用。
我尝试了ProcessBuilder类和Runtime.getRuntime().exec(),但是都抛出了相同的“找不到文件异常”异常。

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


谢谢,
朱利奥

最佳答案

当您使用ProcessBuilder或Runtime.getRuntime()。exec()启动该进程时,它将吞噬正在启动的进程的任何输出。

要查看真正的问题,您需要获取该输出。

使用Runtime.exec(),您需要使用process.getErrorStream()和process.getInputStream()并设置线程以将输出复制到可以看到的地方。

使用ProcessBuilder,您可以在调用ProcessBuilder.start()之前,使用ProcessBuilder.inheritIO()将IO从生成的进程中扩散到当前(父)进程中。

使用ProcessBuilder.inheritIO()将进程输出重定向到服务器日志,您可能会发现错误所在。

请尝试以下操作,看看是否有帮助。

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


一旦知道了错误所在,您就可以制定解决方案。

我怀疑您需要在结果过程中设置一些其他环境变量或某些东西才能使其正常工作。

09-26 10:02