Javaからコマンドを実行する方法

Javaから外部のコマンドを実行することあると思います。

Runtime.getRuntime().exec()はWindowsとLinuxで挙動が異なったり、引数にダブルクォーテーションが入ると意図した挙動にならなかったりするため、バッチファイルを作成しそのファイルを呼ぶ形を取ります。

渡す引数は実際に実行したいコマンドをcmdに渡します。

実行するコマンドを書き込むファイルをbatPathに渡します。この時ファイル名は.batになるようにしておきます。

Windowsの場合はそのまま.batファイルを実行させます。

Linuxの場合はsh XXX.bat を実行させます。

    /**
     * Javaからコマンドを実行する
     * 
     * @param cmd
     *            実行するコマンド
     * @param batPath
     *            実行するコマンドを書き込むファイル
     */
    public static void doExec(String cmd, String batPath) {

        File f = new File(batPath);
        if (f.exists()) {
            if (!f.delete()) {
                throw new Exception("");
            }
        }

        BufferedOutputStream bos = null;
        try {
            bos = new BufferedOutputStream(new FileOutputStream(f));
            bos.write(cmd.getBytes());
            bos.close();
        } catch (FileNotFoundException e) {
            throw new Exception(e);
        } catch (IOException e) {
            throw new Exception(e);
        }

        String execCmd = null;
        if (isWindows()) {
            execCmd = batPath;
        } else {
            execCmd = "/bin/sh " + batPath;
        }

        Process runtimeProcess;
        int processCompleted = -1;

        try {
            runtimeProcess = Runtime.getRuntime().exec(execCmd);
            processCompleted = runtimeProcess.waitFor();
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    runtimeProcess.getErrorStream()));
            String line;
            while ((line = br.readLine()) != null) {
                System.out.printf(line);
            }
        } catch (IOException e) {
            throw new Exception(e);
        } catch (InterruptedException e) {
            throw new Exception(e);
        }

        if (processCompleted != 0) {
            throw new Exception("");
        }

    }