文章目录
  1. 1. 让Maven正确处理javac警告(如果使用了SUN的专用API将会出现此类问题)

让Maven正确处理javac警告(如果使用了SUN的专用API将会出现此类问题)

+————————————————————————–+
|

|
| |
|
|
| |
| 如果你用maven编译项目,而且在项目中用了SUN的专用API,你会得到警告信息,然后Maven会报告编译失败,像这个样子: |
| |
| |
| > …\ |
| > [ERROR] |
| > \workspaces\mvn\javac-warning-test\src\main\java\com\juvenxu\ |
| TestJavacWarning.java:[7,32] |
| > 警告:sun.misc.BASE64Decoder 是 Sun 的专用\ |
| > API,可能会在未来版本中删除\ |
| > [INFO] ————————————————————-\ |
| > [INFO] BUILD FAILURE |
| |
| 这当然是不合理的,javac只是警告而已,maven凭什么就直接报失败呢? |
| |
| 其实最好的解决办法是避免用到这些SUN专用的API,这些API都有现成的替代品,不过本文要讨论的不是这个,如果你用了某个依赖,该依赖用了SUN专 |
| 用API,你往往会束手无策。 |
| |
| 第一反应是Maven肯定可以提供一些配置点,允许我们忽略这种警告,嗯,当初我也是这么想的,一次培训的时候,一同学问到这个问题,我想当然的回答,“ |
| 这个配置javac忽略警告就可以啦,不是Maven的问题”,我自己根本没有试过,这么不负责任的回答我现在想想都脸红。后来和 |
| |
| linux_china |
| 又讨论到这个问题,然后我动手尝试了下,折腾了几乎所有maven-compiler-plugin的配置,到最后竟然是无解!(其实也不算完全无解,至 |
| 少我们可以配置maven-compiler-plugin忽略编译错误,不过这个解决办法连我自己都觉得太恶心) |
| |
| |
| 无解归无解,至少我找到了这个问题的根本原因,其 |

| 实不是我找到的,是Hudson之父Kohsuke |
| Kawaguchi发现的。事情是这样的,Maven的commiter基本都是欧美的,人家的系统基本是英文的,那么他们使用Sun专用API的时候, |
| 遇到的警告信息是英语,以”WARNING“开头的,我们知道,Maven是用maven-compiler-plugin执行编译工作的,而默认情况 |
| |
| maven-compiler-plugin是通过调用javac完成编译的,那么当javac给出”WARNING”的时候,他们根据这个关键字做个 |
| |
| if判断就把事情搞定了。 |
| |
| 可是,他们忘了这个世界还有日本中国等国家啦,虽然Kohsuke |
| Kawaguchi基本在美国混,但在日本肯定有不少朋友的,可能他朋友用日文系统遇到这问题了(当然,他自己也可能有日文系统),更不用提广大的中国 |
| |
| IT群众了。之前,如果你在Google搜索“javac maven |
| 警告”,那是大量的信息,可没一篇有真正的解决方法。直到最近我在[阿里的技术博客](http://pt.alibaba-inc.com/wp/ex |
| perience_798/maven-javac-compiler-chinese-warnings-message-issue.html)看到 |
| 一篇文章讲到了这个问题,并给出了一个patch,方法是强制设定javac使用英文的Locale,其实呢,这么做有点暴力,如果用户比较在意本地化的 |
| 信息怎么办呢? |
| |
| Kohsuke |
| Kawaguchi的建议
显然更合理啦,他说别用j |
| avac的输出来判断警告,而是用javac命令行的返回值来判断,这样就能避免这个问题。 |
| |
| |
| 方案虽好,但他没有实现,这点可以理解,人家是大牛,而且估计系统都是英文的,没空管这小事。 |
| |
| |
| 我基本也在英文系统上跑,实际中也没遇到这问题,也没太大激情去修这个bug,但偶尔的机会和同事Benjamin |
| |
| Bentmann抱怨了几句,无非就是说这个问题困扰大量中国用户啥的,他是Maven |
| 3最主要的commiter,相当给面子啊,没过一周,[就修好了](http://jira.codehaus.org/browse/PLXCOMP |
| -154?focusedCommentId=233546&page=com.atlassian.jira.plugin.system.i |
| ssuetabpanels%3Acomment-tabpanel#action_233546),然后让我测试下。 |
| |
| 嗯,义不容辞,我就建了个空项目,用了个sun.misc.BASE64Decoder,先简单跑一遍,不出所料报错了。接着我再加入如下的配置: |
| |
| |
|

|
| |
|
|
| |
| view |
| plain
copy to |
| clipboard
prin |
| t
[?](http://ww |
| w.juvenxu.com/2010/09/01/maven-javac-warning/#) |
| |
|
|
| |
| 1. <plugin>    </spa |
| n> |
| 2.         <groupId> |
| org.apache.maven.plugins</groupId</sp |
| an>>    
|
| 3.         <artifactId></sp |
| an>maven-compiler-plugin</artifactId< |
| /span>>    
|
| 4.         <version> |
| 2.3.1</version></span |
| >    
|
| 5.         <dependencies></ |
| span>    
|
| 6.                 <dependency |
| >
    
|
| 7.                         <groupId< |
| span>>
org.codehaus.plexus</ |
| groupId
>    
|
| 8.                         <artifactId</spa |
| n>>plexus-compiler-javac</< |
| span>artifactId
>    
|
| 9.                         <version< |
| span>>
1.8.1</version |
| >    
|
| 10.                 </dependency<span |
| >>
    
|
| 11.         </dependencies>< |
| /span>    
|
| 12. </plugin>    </sp |
| an> |
| |
|
|
| |
| 这个问题是在plexus-compiler-javac |
| 1.8.1中修复的,因此强制让maven-compiler-plugin依赖这个版本就可以了,照理说maven-compiler-plugin应 |
| 该升级一下版本,那样就只要配置插件版本,而不是插件依赖,可是目前新版本的maven-compiler-plugin还没有发布,只能凑活使用上面的 |
| 配置啦。 |
| |
| 再用maven编译,会看到这样的输出: |
| |
| > [INFO] Compiling 1 source file to |
| > D:\workspaces\ws-maven-book\javac-warning-test\target\classes\ |
| > [WARNING] |
| > \workspaces\ws-maven-book\javac-warning-test\src\main\java\com\ |
| \juvenxu\TestJavacWarning.java:[3,15] |
| > 警告:sun.misc.BASE64Decoder 是 Sun 的专\ |
| > 用 API,可能会在未来版本中删除\ |
| > [WARNING] |
| > \workspaces\ws-maven-book\javac-warning-test\src\main\java\com\ |
| \juvenxu\TestJavacWarning.java:[7,4] |
| > 警告:sun.misc.BASE64Decoder 是 Sun 的专\ |
| > 用 API,可能会在未来版本中删除\ |
| > [WARNING] |
| > \workspaces\ws-maven-book\javac-warning-test\src\main\java\com\ |
| \juvenxu\TestJavacWarning.java:[7,32] |
| > 警告:sun.misc.BASE64Decoder 是 Sun 的专\ |
| > 用 API,可能会在未来版本中删除\ |
| > [INFO] ————————————————————————\ |
| > [INFO] BUILD SUCCESS\ |
| > [INFO] ———————————————————————— |
| |
| 警告仍然打印出来了,但Build成功了,问题解决啦! |
| |
| 最后的感触是,国内搞开源还需要加勒个油啊!其实这不是什么大的bug,但由于社区中缺少国内的积极分子,才导致这bug一拖再拖没人理,大家一问再问, |
| 没人解决。 |
| |
| 大家一起加勒个油! |
| |
| ————————– 2010-09-10,教师节,更新 ——————————————————- |
| |
| maven-compiler-plugin 2.3.2 发布了,因此只需要配置使用该版本就ok了 |
| |
|
|
| |
|
|
| |
| view |
| plain
copy to |
| clipboard
prin |
| t
[?](http://ww |
| w.juvenxu.com/2010/09/01/maven-javac-warning/#) |
| |
|
|
| |
| 1. <plugin>    </spa |
| n> |
| 2.         <groupId> |
| org.apache.maven.plugins</groupId</sp |
| an>>    
|
| 3.         <artifactId></sp |
| an>maven-compiler-plugin</artifactId< |
| /span>>    
|
| 4.         <version> |
| 2.3.2</version></span |
| >    
|
| 5. </plugin>    </sp |
| an> |
| |
|
|
| |
|
|
| |
|
|
+————————————————————————–+

文章目录
  1. 1. 让Maven正确处理javac警告(如果使用了SUN的专用API将会出现此类问题)