`

Maven无法正确处理javac中文警告信息的问题

 
阅读更多
转:
故障现象:maven在编译含有sun私有API的java代码的时候,会出错并报告BUILD FAILURE。
出错信息如下:

[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Compilation failure

\works\maven\mycode\commons\tools\src\java\com\alibaba\secret\common\util\BAD.java:[9,15] 警告:s
un.misc.BASE64Decoder 是 Sun 的专用 API,可能会在未来版本中删除


经过跟踪maven-compile-plugin及plexus-compiler-javac的代码,发现了问题所在。问题在于plexus-compiler-javac这个模块中的JavaCompiler类。
该类wrap了javac的调用,并捕获了javac的输出,通过字符串比对来判断java编译的警告/出错信息。 在代码中,鬼子硬编码了”warning: “字符串来判断异常信息是否为warning/error,由于在中文环境下,javac输出的信息是上面所列的汉字”警告:…”,因此pluxus-compile-javac会把所有的中文警告信息均判断成CompileError,直接导致maven-compile-plugin抛出编译错误。

在我们以前的解决方案中,用了maven-compile-plugin的一个开关failOnError=false来绕过这个编译异常,这是不对的。因为一旦failOnError=true,那么所有的“正确的”编译异常也被忽略了,这是非常危险的,最坏的后果可直接导致打出来的jar包缺少class文件,而此时编译服务器完全不知情。

那么怎么办呢?
淘宝的同学rednaxelafx很快给出了一个方法,设定-Duser.country=US即可强制jvm以US locale运行。在javac中可以用javac -J-Duser.country=US传入。
于是我开始想办法配置maven-compile-plugin,试图把这个参数传递进去。如下的xml配置:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgument>-J-Duser.country=US</compilerArgument>
</configuration>
</plugin>
缺得到如下的错误信息:

[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Compilation failure
Failure executing javac, but could not parse the error:
javac: 无效的标志: -J-Duser.country=US
用法: javac <options> <source files>
-help 用于列出可能的选项
经过分析maven插件代码,推测javac.exe拦截了-J参数,而maven-compile-plugin中的开关则直接把-J参数传递给了javac Main class,以至抛出上述异常。

至此,看起来不搞点小动作是解决不了问题了。
直接patch plexus-compiler-java如下:

Index: JavacCompiler.java
===================================================================
--- JavacCompiler.java (revision 8722)
+++ JavacCompiler.java (working copy)
@@ -68,6 +68,7 @@
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Properties;
@@ -424,6 +425,8 @@
             {
                 cli.addArguments( new String[] { "-J-Xms" + config.getMeminitial() } );
             }
+            // Force javac to use english locale.
+            cli.addArguments( new String[]{"-J-Duser.country=US"});
         }
         catch ( IOException e )
         {
@@ -545,7 +548,8 @@
         try
         {
             Method compile = c.getMethod( "compile", new Class[] { String[].class, PrintWriter.class } );
-
+            // Force javac to use english locale.
+            Locale.setDefault(Locale.ENGLISH);
             ok = (Integer) compile.invoke( null, new Object[] { args, new PrintWriter( out ) } );

             messages = parseModernStream( new BufferedReader( new StringReader( out.toString() ) ) );
临时调整maven-compile-plugin引用patch后的plexus-compiler-javac库,问题解决。

此问题已经提交给plexus开发团队,看管可到这里跟踪:http://jira.codehaus.org/browse/PLXCOMP-154

PS: plexus差不多都已经被Jason自己抛弃了,希望此兄不要只顾推广maven3, nexus赚钱,及时修补为盼,阿弥陀佛。

参考链接 :http://www.juvenxu.com/2010/09/01/maven-javac-warning/
      http://code.alibabatech.com/blog/experience_798/maven-javac-compiler-chinese-warnings-message-issue.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics