2016-07-29 5 views
0

mojo-executorを使用して別のMojoを実行するmaven Mojoを作成しました。これが実行されると、そのMojo実行の出力はデフォルト出力になります。だから、それを実行し得るとき、それは次のように出力されますmavenプラグインビルドログをインターセプトする方法

[INFO] Compiling 1 source file to /Users/sergio/hello-world/target/classes 
[INFO] 
[INFO] --- utqg-maven-plugin:1.1.0-SNAPSHOT:errorprone (default) @ my-app --- 
/Users/sergio/hello-world/src/test/java/com/mycompany/App2Test.java:30: warning: [UTQG:HelperMethodCannotBePublic] Helper Methods of test classes cannot be public. 
    public String getName() { 
       ^
    (see https://www.mycompany.com/utqg/HelperMethodCannotBePublic) 
/Users/sergio/hello-world/src/test/java/com/mycompany/service/MyServiceTest.java:14: warning: [UTQG:HelperMethodCannotBePublic] Helper Methods of test classes cannot be public. 
    public void myHelperMethod(){ 
      ^
    (see https://www.mycompany.com/utqg/HelperMethodCannotBePublic) 
/Users/sergio/hello-world/src/test/java/com/mycompany/service/MyServiceTest.java:170: warning: [UTQG:E:UseDeprecatedStatementsNotAllowed] Usage of Deprecated Classes, Methods or Variables Not Allowed 
    final URL url = new File(".").toURL(); 
            ^
    (see https://www.mycompany.com/utqg/HelperMethodCannotBePublic) 
Note: /Users/sergio/hello-world/src/test/java/com/mycompany/service/MyServiceTest.java uses or overrides a deprecated API. 
Note: Recompile with -Xlint:deprecation for details. 
3 warnings 

私はErrorproneといくつかのbugcheckersを作成しましたので[OK]を、すべてのそれらの警告が期待されています。しかし、問題は、この出力を標準出力から削除してファイルに入れる必要があることです。しかし、その部分だけ。私がこれまで試したどのような

は、それが実行され得るとき、ファイルへの私の出力をリダイレクトすることでした:

PrintStream originalStream = System.out; 
    try { 
     PrintStream ps = new PrintStream(new FileOutputStream(ERRORPRONE_FILE, false)); 
     System.setOut(ps); 
    } catch (FileNotFoundException e){ 
     LOGGER.error("ErrorProneRunMojo", e); 
     throw new MojoExecutionException(e.getMessage()); 
    } 
    // do my logic of calling the plugin here 
    System.out.flush(); 
    System.setOut(originalStream); 

前提: - 彼らは、標準出力からすべてを削除したので、私はmvn --logFileまたは-lを使用することはできませんし、それをファイルの中に置きます。また、ユーザが--logFileなどを置くことで解決する必要はありません。

+1

私は、システムの標準出力とエラーストリームの設定が唯一の方法だと思います。これで何か問題はありましたか? – Tunaki

+0

はい、正しい文字列がまだ得られていません。それは実行後にすべての文字列を取得していた。しかし、私はコードをチェックし、それは大丈夫だった。 –

+0

MavenProjectには、ロガーの別のインスタンスを参照するか、他のmojoを呼び出す方法に応じて独自のロガーインスタンスを設定する必要があるロガーが含まれていますか?しかし、具体的なコードがなければ、助けが難しいです...さらに、ロガーを使用してあなたのmojoで出力を作成しないようですね? – khmarbaise

答えて

0

[OK]を、私は2つのアプローチを試みたし、それらの両方が働いた:

  • 作成さPrintStream.print()にすべての入力を傍受し、それがあまりにも大変だったとの結果を制御することが難しかったASMエージェントインターセプタ。 ASMガイドで確認する方法は、http://download.forge.objectweb.org/asm/asm4-guide.pdf

  • です。もう1つのオプションは、System.outとSystem.errの再割り当てにとどまっていました。実装が簡単で、結果をよりよく管理できるため、目標を管理することができたため、非常に優れていました。

関連する問題