最近在开发机装了jenkins
做持续集成和自动部署上线。使用ant
脚本做编译打包。遇到了一个问题,分享下。
本质上这个问题不是ant的问题,但在平常使用中很容易被忽略掉,导致排查问题浪费时间。
举个例子,场景是这样的,在Spring MVC中我们常用到注解来简化代码,以Controller为例,有两种写法:
写法1
1
2
3
4
5@RequestMapping(method = RequestMethod.POST, value = "/modify")
public String modify(HttpServletRequest request,
@RequestParam("name") String name,
ModelMap model) {
}写法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
2spring 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