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就得到了上述的错误。
最近在升级招投标网站的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就得到了上述的错误。
相关文章推荐
- Java - 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- java面试题解惑:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- 对于java中变量发生改变,引起的输出结果改变
- java_手动编译运行java代码
- 完整全面的Java资源库(包括构建、操作、代码分析、编译)
- java class反编译后的代码还原
- java中同步嵌套引起的死锁事例代码
- 关于android中的.9图(二)——利用java代码引用设置.9图
- cxf引用webservice生成java代码
- cocos2dx C++中调用oc代码以及 c++中编译java代码
- (转载)JAVA动态编译--字节代码的操纵
- JVM学习笔记(二)------Java代码编译和执行的整个过程
- 当一个对象被当做参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- java代码在编译时出现错误: 编码GBK的不可映射字符 的解决办法
- 八皇后问题 JAVA程序代码以及运行结果
- Java学习之动态编译-动态脚本引擎-脚本引擎执行javascript代码
- weblogic jsp 编译:查看编译后的java中间代码
- 你的Java代码对JIT编译友好么?
- java 实现BufferedImage和ImageReader两种方式获取图片宽高、判断图片类型、获取图片大小工具类代码以及测试响应结果