2013-07-10 28 views
0

我正在写一个需要执行mysql dump的java应用程序,并且我使用的是基于when runtime.exec won't文章的runtime.exec。代码如下:试图从java应用程序执行mysqldump,多个问题

public int exectuteCommand(){ 
    Runtime rt = Runtime.getRuntime(); 
    logger.debug("exexuting cmd: " + showCommand()); 
    int exit = -1; 
    try { 
     Process proc = rt.exec(cmd); 

     ExtProcessStreamHandler errorHandler = new ExtProcessStreamHandler(proc.getErrorStream(), "ERROR"); 
     ExtProcessStreamHandler outHandler = new ExtProcessStreamHandler(proc.getInputStream(), "OUTPUT"); 

     // kick it off 
     errorHandler.start(); 
     outHandler.start(); 
     exit = proc.waitFor(); 

    } catch (IOException e) { 
     logger.error("ERROR!! ~~ executing command " + showCommand(), e); 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     logger.error("ERROR!! ~~ unexpected return for " + showCommand() + " , returned " + exit, e); 
     e.printStackTrace(); 
    } 

    return exit; 
} 

1)进程返回的命令在shell中运行(我在mac上运行这个命令)。我遇到的第一个错误是无法找到mysqldump命令。这导致了这个错误:

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

我解决了通过将文件的完整路径添加到命令。 $ PATH var显示为

/usr/local/mysql/bin/mysqldump 

作为完整路径。我如何确保我的Java应用程序具有该信息?

2)将完整路径的命令时,我得到这个错误信息:

INFO [Thread-1] (ExtProcessStreamHandler.java:28) - external process ERROR : mysqldump: Couldn't find table: ">" 

这是建立命令数组的代码:再次

return new String[] {MYSQLDUMP_CMD, "-u", USER_DEFAULT, "-p"+ PW_DEFAULT, TEST_DB_NAME, 
      ">", DUMP_LOC}; 

,当我复制该命令传递给我的苹果机上的外壳的Java应用程序,它的工作原理。不知道我做错了什么。 在此先感谢!

回答

1

它认为“>”是针对mysqldump的一个参数。您正在调用可执行文件,而不是评估shell表达式。如果您想管输出,请在代码中使用outHandlererrorHandler

另一种方法是调用一个shell,并通过你要评估为参数的表达式:

expr = new StringBuilder() 
    .append(MYSQLDUMP_CMD).append(' ') 
    .append("-u").append(USER_DEFAULT).append(' ') 
    .append("-p").append(PW_DEFAULT).append(' ') 
    .append(TEST_DB_NAME).append(' ') 
    .append(">").append(' ') 
    .append(DUMP_LOC) 
    .toString(); 
return new String[] {"/bin/bash", "-c", expr}; 

如果你的代码来构建命令阵列不换行用单引号间隔参数(如果JDK不会为你做这件事),然后修改StringBuilder语句为你创建被包装的引号。

+1

能够使用--result-file选项而不是> – badperson