2

アプリで使用したいgit実行可能ファイル用の単純なJavaラッパーを作成しています。小さなコード例:

public static void main(String[] args) {
        String gitpath = "C:/eclipse/git/bin/git.exe";
        File folder = new File("C:/eclipse/teste/ssadasd");
        try {
            folder.mkdirs();
            Runtime.getRuntime().exec(
                    gitpath + " clone git@192.168.2.15:test.git", null,
                    folder);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

コードは単に実行を終了することはありません..それが内部に引っかかったようですexec。コマンドラインからgitcloneを実行すると、期待どおりに機能します。たとえば、githubから別のリポジトリを試してみると、それも機能します。

誰かがここで何が起こっているのかについての考えを持っていますか?前もって感謝します

4

3 に答える 3

2

Runtime.getRuntime().execProcessプロセスと対話し、何が起こっているかを確認するために使用できるオブジェクトを返します。私の疑いは、あなたはこのようなことをする必要があるということです:

Process p = Runtime.getRuntime().exec(
    gitpath + " clone git@192.168.2.15:test.git", null,
    folder);
p.waitFor();

そうでない場合は、実行中getErrorStream()またはgetOutputStream()プロセス中に、何が書き込まれているかを確認することもできます。これはデバッグに役立つ可能性があります。

于 2012-10-03T18:55:44.820 に答える
2

これはあなたの質問に対する直接の答えではありませんが、Git操作の直接Java実装(コマンドラインgitのラッピングなし)であるJGitを見てみることをお勧めします。JGitは、EGit(Eclipse Git統合)の基盤であるため、多くの使用と安定化作業が行われます。

于 2012-10-03T18:57:43.420 に答える
1

Runtime.exec()さまざまな状況でハングする可能性があります-Javadocを引用しているこの記事を参照してください(JDK 7で):

一部のネイティブプラットフォームでは、標準の入力ストリームと出力ストリームに限られたバッファサイズしか提供されないため、サブプロセスの入力ストリームの書き込みまたは出力ストリームの読み取りに失敗すると、サブプロセスがブロックされ、デッドロックが発生する可能性があります。

この記事では、出力ストリームとエラーストリームを消費するソリューションの例をいくつか示していますが、ProcessBuilderクラスは記事の作成後に導入されたと思いますので、より満足のいくものになる可能性があります。新しいJavadocは次のように追加します。

必要に応じて、ProcessBuilderクラスのメソッドを使用してサブプロセスI/Oをリダイレクトすることもできます。

于 2012-10-03T21:21:12.343 に答える