转:
故障现象: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
分享到:
相关推荐
该项目可从为支持JSR308的javac编译器提供简单的Maven集成。 用法 克隆并构建Maven-checkerframework-javac 配置Maven编译器插件以使用maven-checkerframework-javac提供的“ javac + jsr308”编译器 从检查器框架...
NULL 博文链接:https://cjhz.iteye.com/blog/1721639
maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装...
springboot整合thymeleaf+maven实现异常处理页面,实现异常跳转页面
对于使用maven进行开发的过程中出现的乱码问题做了一个处理,并在其中给出了解决的方案
为了让Maven能够正确获取到jar包,第三方jar包必须放置到本地仓库的正确位置上。Maven已经提供了maven-install-plugin这样的插件能够使Jar包的安装过程更加容易、更少出错。可以用下面的命令安装一个JAR包到本地仓库...
maven 实用手册 中文 Maven权威指南中文版 Maven权威指南中文版
Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令
maven3.0maven3.0maven3.0maven3.0maven3.0maven3.0maven3.0maven3.0maven3.0maven3.0
Maven是一种构建工具,一种项目管理工具,一种用来运行构建任务的抽象容器。对于那些成熟的,希望用一致的方式来管理和构建大量相互依赖的模块和类库,并且使用了 数千第三方组件的项目来说,Maven已经证明了它是一...
maven 权威指南中文版
maven常见问题及解决办法
Maven3.9.4版本压缩包,仅供学习参考,更新版本请前往Maven官方下载;Maven3.9.4版本压缩包,仅供学习参考,更新版本请前往Maven官方下载;Maven3.9.4版本压缩包,仅供学习参考,更新版本请前往Maven官方下载;Maven...
maven 工具 maven 工具 maven 工具 maven 工具 maven 工具
nexus 搭建 maven仓库nexus 搭建 maven仓库nexus 搭建 maven仓库nexus 搭建 maven仓库nexus 搭建 maven仓库
jruby-maven-plugins, 以 Maven 方式,Maven 插件用来处理 rubygems 包括对 rspec Rails Cucumber rake等的支持 Maven 插件 gem-工件有 Maven 存储库,torquebox.org 提供了来自 rubygems.org的gem ( 只有 ruby 和...
maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程
maven
Maven+SpringMVC实现统一异常处理