我创建了一个使用mojo-executor运行另一个Mojo的maven Mojo。执行此操作时,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创建了一些bugcheckers。但问题是我必须从标准输出中删除此输出并将其放入文件中。但只有那一部分。
到目前为止我尝试过的是在执行时将输出重定向到文件:
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或类似内容时,解决方案也不可靠。< / p>
答案 0 :(得分:0)
好的,我尝试了两种方法,两种方法都有效:
创建了一个ASM代理拦截器,拦截了PrintStream.print()
的所有输入,但这太难了,很难控制结果。您可以在http://download.forge.objectweb.org/asm/asm4-guide.pdf
另一个选择是继续重新分配System.out和System.err。它实在是太好了,因为它可以更容易实现,并且可以更好地控制结果,因为我们可以管理maven目标。