【问题标题】:cannot run command with processbuilder or runexec inside eclipse无法在 Eclipse 中使用 processbuilder 或 runexec 运行命令
【发布时间】:2015-04-14 12:32:47
【问题描述】:

我正在尝试从我的 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);
}

谢谢, 朱利奥

【问题讨论】:

  • 尝试你的 .exe 命令的绝对路径;那么你也可以设置builder.directory(workDir);

标签: java eclipse mongodb tomcat mongodump


【解决方案1】:

当您使用 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();

一旦您知道错误是什么,您就可以找出解决方案。

我怀疑您需要在生成的过程中设置一些额外的环境变量或其他东西才能使其工作。

【讨论】:

  • 我再次更新了问题并插入了我在 ProcessBuilder 变体中所做的事情,在 builder.start() 处引发异常,然后我无法从进程中读取任何错误流
【解决方案2】:

我还没有尝试过,但也许你可以这样做:

Mongo client = new MongoClient();
client.getDB("myDb").command("mongodump ...");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多