Как перехватить журнал сборки плагина maven

Я создал Maven Mojo, который запускает другой Mojo, используя mojo-executor. Когда это будет выполнено, вывод этого выполнения Mojo будет выводиться по умолчанию. Итак, когда он выполняется, он печатает следующее:

[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. Но проблема в том, что я должен удалить этот вывод из стандартного вывода и поместить его в файл. Но только эта часть.

До сих пор я пытался перенаправить вывод в файл при его выполнении:

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 ответ

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

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

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

Другие вопросы по тегам