1

私は、mysql ダンプを実行する必要がある Java アプリを作成しています。runtime.exec が記事にならない場合に基づいて、runtime.exec を使用しています。コードは以下のとおりです。

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)プロセスが返すコマンドはシェルで機能します(これをMacで実行しています)。最初に発生したエラーは、mysqldump コマンドが見つからないことでした。その結果、次のエラーが発生します。

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

ファイルの完全なパスをコマンドに追加することで解決しました。$PATH 変数が示しています

/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 アプリに渡されたコマンドを Mac のシェルにコピーすると、機能します。私が間違っているのかわかりません。前もって感謝します!

4

2 に答える 2