Ant编译导致的Java bug问题

最近在开发机装了jenkins做持续集成和自动部署上线。使用ant脚本做编译打包。遇到了一个问题,分享下。
本质上这个问题不是ant的问题,但在平常使用中很容易被忽略掉,导致排查问题浪费时间。

举个例子,场景是这样的,在Spring MVC中我们常用到注解来简化代码,以Controller为例,有两种写法:

  1. 写法1

    1
    2
    3
    4
    5
    @RequestMapping(method = RequestMethod.POST, value = "/modify")
    public String modify(HttpServletRequest request,
    @RequestParam("name") String name,
    ModelMap model) {
    }
  2. 写法2

    1
    2
    3
    4
    5
    @RequestMapping(method = RequestMethod.POST, value = "/modify")
    public String modify(HttpServletRequest request,
    String name,
    ModelMap model) {
    }

两种写法的区别是,一个添加了注解@RequestParam("name"),而另一个没有,以默认的名字name作为RequestParam。

很多人为了图方便使用写法2的方式。但是遇到使用ant做打包时就要特别注意了。

可能会出现这个问题:

1
2
spring java.lang.IllegalArgumentException: Name for argument type [java.lang.String]
Name for argument type [java.lang.String] not available, and parameter name information not found in class file either

出错原因是没有通过@RequestParam(“name”)明确告诉Spring MVC使用name进行入参。action的参数标注默认是debug级别,而在linux下编译时是忽略了这些标注,导致请求时就会找不到name的参数。

修复这个问题也很容易,不用修改代码,只要在开发工具中配置“Java Compiler”,如eclipse只要将“Add variable attributes to generated class files”勾选,意思是将局部变量信息添加到类文件中。

如果使用的是ant脚本,可参考以下配置,这个问题是由于忽略了vars导致的:

1
2
3
4
5
<!--  建立build/classes 路径,并编译class 文件到build/classes 路径下-->
<target name="compile" depends="clean">
<mkdir dir="${classes}" />
<javac encoding="utf-8" srcdir="${basedir}/src" destdir="${classes}" classpathref="project.classpath" includeantruntime="false" debug="true" debuglevel="lines,vars,source"/>
</target>

这里还有篇类似的文章可以参考:

http://blog.csdn.net/liuguanghaoputin/article/details/8695600