让这个问题折腾了好长时间,最终在网上看到了一篇文章,解决了这个问题。
转自: http://timen-zbt.iteye.com/blog/1871152
在Java项目进行增量更新的时候经常会出现java.lang.NoSuchMethodError的问题,究其原因有很多:
1、在引包是引用了不匹配的包版本
2、开发环境和运行环境的不一致
3、以上两点都齐全,并且确实有对应的方法存在,依然报java.lang.NoSuchMethodError错误
。。。
本文章主要解决第三种问题:对应的方法存在却依然报java.lang.NoSuchMethodError错误
错误重现:
搭建Java工程,并生成如下两个类
TestNoSuchMethodError用于测试
- package com.timen.demo;
- public class TestNoSuchMethodError {
- public static void main(String[] args) {
- Person p = new Person();
- p.setName("timen");
- p.setSuperUser(true);
- System.out.println(p.getName() + " is Super User? " + p.isSuperUser());
- }
- }
- package com.timen.demo;
- public class Person {
- private String name;
- private boolean superUser;
- public Person() {
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public boolean isSuperUser() {
- return superUser;
- }
- public void setSuperUser(boolean superUser) {
- this.superUser = superUser;
- }
- }
执行TestNoSuchMethodError,结果如下:
- D:\MyWorkspace\sts\NoSuchMethodError\bin>java com.timen.demo.TestNoSuchMethodError
- timen is Super User? true
- D:\MyWorkspace\sts\NoSuchMethodError\bin>
- package com.timen.demo;
- public class Person {
- private String name;
- private Boolean superUser;
- public Person() {
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Boolean isSuperUser() {
- return superUser;
- }
- public void setSuperUser(Boolean superUser) {
- this.superUser = superUser;
- }
- }
然后将编译后的Person.class拷贝到刚刚发布的项目中替换掉刚才的Person.class文件(注意你没有更改TestNoSuchMethodError类,所以大多你不会想更新这个类)
问题发生了:
- D:\temp>java com.timen.demo.TestNoSuchMethodError
- Exception in thread "main" java.lang.NoSuchMethodError: com.timen.demo.Person.setSuperUser(Z)V
- at com.timen.demo.TestNoSuchMethodError.main(TestNoSuchMethodError.java:7)
- D:\temp>
该java.lang.NoSuchMethodError为setSuperUser(Z)对应的方法应该是setSuperUser(boolean var)
而在新的Person文件中的setSuperUser方法的签名为可以用javap -s Person查看:
- D:\temp\com\timen\demo>javap -s Person
- Compiled from "Person.java"
- public class com.timen.demo.Person extends java.lang.Object{
- public com.timen.demo.Person();
- Signature: ()V
- public java.lang.String getName();
- Signature: ()Ljava/lang/String;
- public void setName(java.lang.String);
- Signature: (Ljava/lang/String;)V
- public java.lang.Boolean isSuperUser();
- Signature: ()Ljava/lang/Boolean;
- public void setSuperUser(java.lang.Boolean);
- Signature: (Ljava/lang/Boolean;)V
- }
- D:\temp\com\timen\demo>