2016-07-29 1 views
0

Я создал maven Mojo, который запускает другой Mojo, используя mojo-executor. Когда это будет выполнено, выход этого выполнения 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 

Ok, все эти предупреждения, как ожидается, потому что я создал несколько bugcheckers с Errorprone. Но проблема в том, что я должен удалить этот вывод из стандартного вывода и поместить его в файл. Но только эта часть.

То, что я пытался до сих пор был перенаправить мой вывод в файл, когда он начал выполняться:

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

Хорошо, я попробовал два подхода, и оба из них работали:

  • создал ASM агент перехватчик, который перехватил все входы PrintStream.print(), но это было слишком трудно, и было трудно контролировать результаты. Вы можете проверить, как это сделать в руководстве ASM по адресу http://download.forge.objectweb.org/asm/asm4-guide.pdf

  • Остальная опция оставалась с переназначением System.out и System.err. Это было намного лучше, потому что его легче реализовать, и результаты можно лучше контролировать, поскольку мы можем управлять целями maven.