Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用Apache Commons Exec执行mysql命令以恢复转储_Java_Mysql_Processbuilder_Apache Commons Exec - Fatal编程技术网

Java 无法使用Apache Commons Exec执行mysql命令以恢复转储

Java 无法使用Apache Commons Exec执行mysql命令以恢复转储,java,mysql,processbuilder,apache-commons-exec,Java,Mysql,Processbuilder,Apache Commons Exec,我的目标是使用Mysql命令恢复Mysql转储 在使用ProcessBuilder的代码和ApacheCommonsExec(1.3)的代码之间,我有一个明显的行为差异 这段代码运行得非常好 List<String> params = new ArrayList<>(); params.add("sh"); params.add("-c"); params.add("mysql -uroot -proot < /tm

我的目标是使用Mysql命令恢复Mysql转储

在使用ProcessBuilder的代码和ApacheCommonsExec(1.3)的代码之间,我有一个明显的行为差异

这段代码运行得非常好

List<String> params = new ArrayList<>();
params.add("sh");
params.add("-c");
params.add("mysql -uroot -proot < /tmp/the_dump.sql");

ProcessBuilder pb = new ProcessBuilder(params);
Process p = pb.redirectErrorStream(true).start();
int exitValue = p.waitFor();
由于以下错误而崩溃:

注意apachecommons Exec解释的命令末尾缺少'。

有人知道如何使用ApacheCommonsExec吗

非常感谢你的帮助,
Sylvain

sh shell正在将mysql-uroot-proot-e'source/tmp/The_dump.sql'解释为单个文件,并试图找到要执行的文件。您需要通过写入sh的输入流将命令传递给sh

sh shell通常接受来自stdin流的命令。如果在终端窗口中启动sh,则键盘为stdin。在本例中,您正在启动一个子流程,因此Java可以访问该子流程的输入和输出流。在Java中,您可以通过执行以下操作将命令写入sh的流:

CommandLine cmdLine = new CommandLine("/usr/bin/sh");
byte[] buf = "mysql -uroot -proot -e 'source /tmp/the_dump.sql'".getBytes();
ByteArrayInputStream is = new ByteArrayInputStream(buf);
PumpStreamHandler streamHandler = new PumpStreamHandler(System.out, System.err, is);
Executor executor = new DefaultExecutor();
executor.setStreamHandler(streamHandler);
int exitValue = executor.execute(cmdLine);

请注意,通过在PumpStreamHandler中使用
System.out
System.err
,您将处理java进程的输出和错误流,而不是sh子进程。

感谢您的提示,我将尽快尝试。在任何情况下,我还必须处理用户输入以提供用户密码,因此很难处理这两个输入!因此,我选择了一个使用接受一些参数的shell文件的解决方案。处理起来要简单得多。
CommandLine cmdLine = new CommandLine("/usr/bin/sh");
byte[] buf = "mysql -uroot -proot -e 'source /tmp/the_dump.sql'".getBytes();
ByteArrayInputStream is = new ByteArrayInputStream(buf);
PumpStreamHandler streamHandler = new PumpStreamHandler(System.out, System.err, is);
Executor executor = new DefaultExecutor();
executor.setStreamHandler(streamHandler);
int exitValue = executor.execute(cmdLine);