转:
故障现象: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
分享到:
相关推荐
8. **错误和警告**:编译过程中可能出现语法错误、类型不匹配等问题,javac会输出错误信息帮助定位问题。警告通常不影响编译,但建议解决以保持代码质量。 9. **优化编译**:有些编译器如Javac提供了优化选项,例如...
在使用IntelliJ IDEA(IDEA)开发Java项目时,可能会遇到“Error:java: 无效的目标发行版: 11”的...希望这些信息能对你有所帮助,如果你在今后的开发过程中遇到其他问题,也欢迎继续查阅相关资料或寻求进一步的帮助。
遗憾的是,由于我们无法直接访问这个链接获取详细信息,所以无法直接解析该博文的内容。不过,我们可以推测这篇文章可能详细介绍了"clas"编译指令的用法、应用场景以及可能涉及的相关技术。 从标签"源码"和"工具"来...
3. **编译与处理**:使用支持注解处理的编译器(如JDK的javac)或构建工具,确保注解处理器能在适当的时候执行。 4. **运行时支持**:对于运行时注解,需要确保运行环境(JVM)能够识别和处理这些注解,这通常由...
此外,它还涵盖了并发编程中的常见问题,如不正确的锁使用,以及不安全的线程状态访问等。 error-prone-master是项目的源代码仓库,其中包含了项目的全部源代码、构建脚本、测试用例以及文档。开发者可以通过克隆或...
3. **错误和警告修复**:Ant 1.9.4 可能修复了一些已知的问题,增强了与其他软件库的兼容性,减少了构建过程中出现错误的可能性。 4. **API更新**:对于开发者来说,可能会有一些API的更新,以提供更好的扩展性和...
10. **错误和警告**:构建过程中,编译器和链接器会发出错误和警告信息,帮助开发者识别并修复问题。正确处理这些信息是确保构建成功的关键。 总的来说,“Build”涵盖了从源代码到可执行程序的整个转化过程,涉及...
9. **错误和警告处理**:编译期间产生的错误和警告需要被正确处理,开发者可能通过编写脚本或配置来自动化这个过程。 10. **代码质量工具**:静态代码分析工具如Checkstyle、PMD和FindBugs可以帮助在编译阶段发现...
6. **编译错误和警告**:编译过程中可能会遇到语法错误、类型不匹配等问题,这些问题会在命令行中显示出来,需要开发者根据错误信息进行修复。同时,编译器也会给出警告,虽然不影响编译,但建议处理以避免潜在问题...
例如,开发者可以通过配置忽略特定的编译警告或错误,使得看似有问题的代码能够成功构建。 为了确保代码质量,理解编译器的工作原理和限制至关重要。开发者应该遵循最佳实践,例如使用强类型、避免过度使用反射和...
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环境中...