您的位置:首页 > 编程语言 > Java开发

java代码不变引用的包改变引起编译结果的改变

2012-08-01 15:00 218 查看
java代码不变引用的包改变引起编译结果的改变

最近在升级招投标网站的struts2时发现了这样的事情:java源代码不变,引用的库改变会使编译的class文件改变。

最开始时在本机xp下调好升级struts2.0.14到2.3.4后,上传至服务器,发现出现错误:NoSuchMethodError ...context.get(Object)在FileUpLoadIntercepter中。在本机虚拟安装服务器操作系统windows server 2003 x64装上却无此错误。

在xp环境下恢复2.0.14后也出现此错误。仔细对照改变的东西,除了lib下一堆jar外就是web.xml不一样。

抱着试一试的心态将2.0.14的class替换掉2.3.4的,居然不再报那个错误了。

仔细一想,原来源代码里有一个自己更改过的struts2源文件FileUpLoadIntercepter,将别的class复原,单替换这个class文件,果然是这个class文件变了。

源代码一样,反编译查看结果也一样,但是这两个class就是不一样,不一样的原因是这个源文件所引用的包变了。由struts2.0.14的包变成了struts2.3.4的包。

过了两天,同事身上又发生了类似的事情:只改变了bean下面的一个类,action却抛出异常;又是抱着试一试的心态,将新编译的同类action的class文件拷贝到服务器上,问题得以解决。

以同事的例子试做说明:同事的bean里原来是int a;int getA();void setA(int a),action里调用的是setA(...)。升级strtus2后bean改变成Integer a;Integer getA();void setA(Integer a)。只把改变后的bean放到服务器上,服务器报NoSuchMethodError setA(I)V,把编译后的action也换掉后,不再报错。推测原因是在eclipse环境下,bean更改后,eclipse自动把action重新编译了,action中的调用有setA(int)改成了setA(Integer),这样只换bean不换class就得到了上述的错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐