【问题标题】:error trying to open cmd using apache commons-exec jar尝试使用 apache commons-exec jar 打开 cmd 时出错
【发布时间】:2016-09-04 02:32:04
【问题描述】:

我正在尝试从 apache commons-exec 执行 mysql 转储,但出现以下错误

线程“主”java.io.IOException 中的异常:无法运行程序 "cmd.exe \c" (in directory "."): CreateProcess error=2, 系统 找不到指定的文件 java.lang.ProcessBuilder.start(ProcessBuilder.java:470) 在 java.lang.Runtime.exec(Runtime.java:593) 在 org.apache.commons.exec.launcher.Java13CommandLauncher.exec(Java13CommandLauncher.java:61) 在 org.apache.commons.exec.DefaultExecutor.launch(DefaultExecutor.java:279) 在 org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:336) 在 org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:166) 在 org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:153) 在 com.etq.e2mc.platform.windows.WindowsProcess.execCommons(WindowsProcess.java:87) 在 com.etq.e2mc.platform.windows.WindowsProcess.main(WindowsProcess.java:79) 引起:java.io.IOException: CreateProcess error=2,系统 找不到在 java.lang.ProcessImpl.create(Native 方法)在 java.lang.ProcessImpl.(ProcessImpl.java:177) 在 java.lang.ProcessImpl.start(ProcessImpl.java:28) 在 java.lang.ProcessBuilder.start(ProcessBuilder.java:452) ... 8 更多

这是我正在使用的代码,它非常简单直接,但我不知道为什么它不调用 cmd(注意:尝试在没有 cmd 的情况下直接调用 mysql 转储,我得到相同类型的错误),希望有任何帮助

    public static void main(String[] args) throws Exception {
        execCommons();
    }

    public static void execCommons() throws ExecuteException, IOException {
        CommandLine cmd = new CommandLine("cmd.exe /c");
        cmd.addArguments("mysqldump");
        cmd.addArguments(new String[] { "-u", "root", " -P", "3316", " -h", "localhost", " -A", ">"});
        cmd.addArguments("\"G:\\test.sql \"" , false);
        new DefaultExecutor().execute(cmd);

    }

【问题讨论】:

  • 你能从Run 启动cmd 吗?哪个版本的 Windows? cmd 是否在 PATH 变量中?
  • @SabirKhan 在任何地方运行一切正常,mysqld 转储已添加到 PATH,我可以打开 cmd,从运行运行 mysqldump 就好了!

标签: java mysql apache-commons-exec


【解决方案1】:

在 Windows 中从(普通)java 执行外部程序:

Process p = Runtime.getRuntime().exec("cmd /c start /wait \"title\" \""+exe_path_and_other_parameters+"\"");
p.waitFor();

【讨论】:

  • 我尝试了这种方法,它一直在等待,甚至从不执行转储,这就是我尝试使用 apache commoons-exec 的原因
  • 如果您不需要读取程序中的输出,也可以删除 .waitFor() 。或编写一个 .bat(带有 echo-es)并调用它。无论如何,这应该可以...您确定手动启动 mysqldump 可以正常工作吗?
  • 我确定它工作正常,我是否添加 waitfor 都没关系,mysql 转储永远不会使用你提到的方法执行
【解决方案2】:

由于某种原因,commons-exec 似乎不喜欢用问题中的命令措辞(用"cmd.exe /c" 初始化CommandLine),将其改写为以下内容后似乎一切正常

    public static void main(String[] args) throws Exception {
        execCommons();
    }

    public static void execCommons() throws ExecuteException, IOException {
        CommandLine cmd = new CommandLine("cmd.exe ");
        cmd.addArgument("/c");
        String command = "mysqldump " + "-u" + "root" + " -P" + "3316" + " -h" + "localhost" + " -A >" + "\"G:\\test.sql \"";
        cmd.addArgument(command,false);
        new DefaultExecutor().execute(cmd);    
    }

我不知道为什么它会这样工作,因为文档中没有说明,但我把它留在这里以防它对某人有帮助。但如果有人有任何想法,请告诉

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多