`

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

分享到:
评论

相关推荐

    一个简单易用的java编译工具

    8. **错误和警告**:编译过程中可能出现语法错误、类型不匹配等问题,javac会输出错误信息帮助定位问题。警告通常不影响编译,但建议解决以保持代码质量。 9. **优化编译**:有些编译器如Javac提供了优化选项,例如...

    IDEA导入外部项目报Error:java: 无效的目标发行版: 11的解决方法

    在使用IntelliJ IDEA(IDEA)开发Java项目时,可能会遇到“Error:java: 无效的目标发行版: 11”的...希望这些信息能对你有所帮助,如果你在今后的开发过程中遇到其他问题,也欢迎继续查阅相关资料或寻求进一步的帮助。

    clas 编译指令

    遗憾的是,由于我们无法直接访问这个链接获取详细信息,所以无法直接解析该博文的内容。不过,我们可以推测这篇文章可能详细介绍了"clas"编译指令的用法、应用场景以及可能涉及的相关技术。 从标签"源码"和"工具"来...

    annotations-10.0.2.jar.zip

    3. **编译与处理**:使用支持注解处理的编译器(如JDK的javac)或构建工具,确保注解处理器能在适当的时候执行。 4. **运行时支持**:对于运行时注解,需要确保运行环境(JVM)能够识别和处理这些注解,这通常由...

    error-prone,将常见的Java错误捕获为编译时错误.zip

    此外,它还涵盖了并发编程中的常见问题,如不正确的锁使用,以及不安全的线程状态访问等。 error-prone-master是项目的源代码仓库,其中包含了项目的全部源代码、构建脚本、测试用例以及文档。开发者可以通过克隆或...

    apache-ant-1.9.4

    3. **错误和警告修复**:Ant 1.9.4 可能修复了一些已知的问题,增强了与其他软件库的兼容性,减少了构建过程中出现错误的可能性。 4. **API更新**:对于开发者来说,可能会有一些API的更新,以提供更好的扩展性和...

    Build

    10. **错误和警告**:构建过程中,编译器和链接器会发出错误和警告信息,帮助开发者识别并修复问题。正确处理这些信息是确保构建成功的关键。 总的来说,“Build”涵盖了从源代码到可执行程序的整个转化过程,涉及...

    Santos_CC2Acts:CC2编译活动

    9. **错误和警告处理**:编译期间产生的错误和警告需要被正确处理,开发者可能通过编写脚本或配置来自动化这个过程。 10. **代码质量工具**:静态代码分析工具如Checkstyle、PMD和FindBugs可以帮助在编译阶段发现...

    compile_test

    6. **编译错误和警告**:编译过程中可能会遇到语法错误、类型不匹配等问题,这些问题会在命令行中显示出来,需要开发者根据错误信息进行修复。同时,编译器也会给出警告,虽然不影响编译,但建议处理以避免潜在问题...

    AndYetIt编译

    例如,开发者可以通过配置忽略特定的编译警告或错误,使得看似有问题的代码能够成功构建。 为了确保代码质量,理解编译器的工作原理和限制至关重要。开发者应该遵循最佳实践,例如使用强类型、避免过度使用反射和...

    eclipse(Java)安装包,需搭配jdk安装软件

    JDK是Java编程的基础,包含了编译Java源代码所需的Java编译器(javac)和其他必要的工具。 1. **JDK安装**: JDK是Java程序运行的基础,它包括Java运行时环境(JRE)和开发工具。在Windows系统上,可以从Oracle...

    个人资料

    然后,输入 `java -version` 和 `javac -version` 检查Java和Java编译器是否已正确安装和配置。 4. **IDE集成**: 如果你打算使用集成开发环境(IDE),如Eclipse或IntelliJ IDEA,你需要确保它们能够在Linux环境中...

Global site tag (gtag.js) - Google Analytics