3

私の目標は、私の要件の1つとしてJavaからSVNコマンドを実行することです。同じように、TortoiseSVNコマンドラインツールをすでにインストールしています。適切なパス「C:/ProgramFiles」/TortoiseSVN/bin」を環境の「Path」変数に追加しました。

上記の設定で、「svn --version」などを使用して、Windowsコマンドラインからsvnコマンドを実行できます。これは完全に正常に機能します。

同じことを実行するためにコードに戻ってきました。これにはprocessbuilderを使用しています。ただし、上記のエラーが発生します--java.io.IOException:プログラム "svn --version"を実行できません:CreateProcess error = 2、システムは指定されたファイルを見つけることができません。

私はすでに物事をフォローしようとしました、

  1. ProcessBuilder.environmentを使用して、PathとPATHの値を確認しました。パスは空ですが、PATHには「TortoiseSVN/bin」パスを含む必要なすべてのアプリケーションパスが構成されています。これにより、ProcessBuilderのパスに実行可能ファイルの場所がないという理論が明確になります。

  2. 実行中に、svn --versionだけでなく、完全なパス、つまり「C:/ProgramFiles/TortoiseSVN/bin/svn.exe」を指定しようとしました。それも同じエラーを出しました。

  3. 同じ例外で失敗した「java-version」のような他の実行可能ファイルに対して同じコードを試しました。

私は今、非常に基本的な何かが正しくないと感じています。でも、これを1日以上頭にぶつけてみましたが、何の手がかりも得られません。

もう1つ、Windows7ボックスでこれを実行しています。

以下は私が使用しているコードです、

    import java.io.BufferedReader;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;

    public class RunningExecutable {

public static void main(String[] args){
    String command = "svn --version";

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    try {           
        ProcessBuilder svnProcessBuilder = new ProcessBuilder(command);
        String PATH = svnProcessBuilder.environment().get("PATH");
        System.out.println("PATH - " + PATH);

        String path = svnProcessBuilder.environment().get("Path");
        System.out.println("Path - " + path);

        Process procObject = svnProcessBuilder.start();

        BufferedReader cmdStreamReader = new BufferedReader(new InputStreamReader(procObject.getInputStream()));
        String cmdOutput;
        while ((cmdOutput = cmdStreamReader.readLine()) != null) {
            outputStream.write((cmdOutput + "\n").getBytes());
        }
        System.out.println("O/p - " + outputStream.toString());
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Throwable th) {
        th.printStackTrace();
    }
}
    }

ヒント/ポインタを楽しみにしています。

ありがとう、ヴィッキー

4

2 に答える 2

8

ProcessBuilder正しく使用していないためです。Javadocはかなり明確です。

--version呼び出そうとしているプロセス名の一部として引数を渡すことはできません。これはプロセスのファイル名ではありません。プロセスを直接実行している舞台裏では、シェルは関係していません。

ProcessBuilder svnProcessBuilder = new ProcessBuilder("svn", "--version");
于 2012-03-10T04:58:53.587 に答える
2

実行可能ファイルを引数から分離する必要があります。

new ProcessBuilder("svn", "--version")

詳細と例については、ProcessBuilderコンストラクタJavaDocを参照してください。

于 2012-03-10T04:55:21.070 に答える