2016-05-11 14 views
0

外部プログラムを実行し、そのプログラムの出力をコンソールに出力するグルーヴィースクリプトを書く必要があります。ここでgroovyスクリプト内で外部プログラムを実行し、出力を取得する

はに関するコードスニペットです:

def pmdCommand = "${scriptDir}/run.sh pmd -d ${filesToAnalyse}" 

def sout = new StringBuffer() 
def serr = new StringBuffer() 

def process = pmdCommand.execute() 
process.consumeProcessOutput(sout, serr) 
process.waitFor() 
if (process.exitValue() !=0) { 
    System.err << serr.toString() 
    System.exit(-1) 
} 
else { 
    System.out << sout.toString() 
    System.exit(0) 
} 

私はJavaで似た何かをしたが、私はグルーヴィーにそれを翻訳することはできません。

StringBuffer output = new StringBuffer(); 
String s = null; 

try { 
    Process p = Runtime.getRuntime().exec(command); 
    p.waitFor(); 

    BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); 

    while ((s = stdInput.readLine()) != null) { 
     System.out.println(s); 
    } 

    while ((s = stdError.readLine()) != null) { 
     System.err.println(s); 
    } 

    System.exit(0); 
} 
catch (Exception e) { 
    e.printStackTrace(); 
    System.exit(-1); 
} 

アップデート:私はのwaitForを(と思われる)は決して戻らないとブロックの実行

ソリューションエマニュエル・ローザによって提供:

def pmdCommand = "/usr/src/app/lib/pmd/bin/run.sh pmd -d ${filesToAnalyse} -f codeclimate -R ${ruleset} -l apex -v 35" 

def sout = new StringBuffer() 
def serr = new StringBuffer() 

def process = pmdCommand.execute() 
process.consumeProcessOutput(sout, serr) 
process.waitForProcessOutput() 

System.out << sout.toString() 
System.exit(0) 
+0

Groovyのコードで何が問題になっていますか? –

+0

@tim_yates上記のGroovyコードを更新しましたが、waitFor()メソッドが返さないようです –

答えて

3

documentation状態consumeProcessOutput()その...

出力およびエラーの文字列を取得します。 msをプロセスから取得し、それらを完全な出力バッファのためにブロッキングから守るために に読み込みます。 処理されたストリームデータは、指定されたOutputStreamに追加されます。 の場合、2つのスレッドが開始されるため、このメソッドはすぐに戻ります。

これまでのところとても良いです。ここに重要な部分があります...

waitFor()が呼び出されても、スレッドはjoin()されません。完全に消費コールwaitForProcessOutput()であることを出力するために を待つために

そしてソリューション...

process.waitFor()process.waitForProcessOutput()に置き換えてください。

+0

ありがとう、これは唯一の問題ではありませんでしたが、間違いなく問題の一部です。 –

関連する問題