» 转载请注明来源:贰号楼肆层 » 《关于Maven无法正确处理javac中文警告信息的问题》
来源:互联网 发布:汉服好的淘宝店铺推荐 编辑:程序博客网 时间:2024/05/11 06:00
关于Maven无法正确处理javac中文警告信息的问题
故障现象:在本人的windows环境下,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://pt.alibaba-inc.com/wp/experience_798/maven-javac-compiler-chinese-warnings-message-issue.html
- » 转载请注明来源:贰号楼肆层 » 《关于Maven无法正确处理javac中文警告信息的问题》
- Maven无法正确处理javac中文警告信息的问题
- 让Maven正确处理javac警告
- 让Maven正确处理javac警告
- [原创,转载请注明来源]android中sqlite数据库的中文数据的插入(insert)和查询(select)
- 关于数据的异步传输之我见 转载请注明!
- Androidstudio快捷键(转载请注明:Android开发中文站 » Android Studio 快捷键)
- 关于Handler Leak警告的正确处理方法
- 转载请注明出处
- 关于原始输入--XP新技术(原创,转载请注明出处)
- 《大型网站技术架构》读书笔记 (转载请注明来源:http://zhanjia.iteye.com/blog/2038540)
- 引用请注明出处和转载请注明出处?我的看法
- 中文问题的来源
- java的远程数据库连接,超时问题解决(转载请注明原处)
- Discuz的安装 (原创帖,转载请注明出处)
- 怎样设计web“帮助页面”更有效 作者:Fred.ren 来源:DIV之家(转载请注明)
- fedora 16下配置nfs、ftp服务遇到的两个问题总结,备忘备查,转载请注明出处,商业用途请联系本人
- 糗事百科出品,转载请注明)
- 网站设计要点
- 内聚度和耦合度
- 看书
- oracle 返回 数据集
- apt-get install python2.6-dev to fix "Python.h: No such file or directory"
- » 转载请注明来源:贰号楼肆层 » 《关于Maven无法正确处理javac中文警告信息的问题》
- 诊断索引健全性的新工具
- template的用法(转载)---希望对大家有用
- DDOS拒绝服务攻击原理
- 如何使用不同的用户登录到共享文件夹
- 求泰坦之旅tqelysion中文版下载
- test
- flex 中 raido buttion 在datagrid 中选不中的问题
- SQL Server 2008的逻辑查询处理步骤