一个神奇的bug,2017年的一个工程A依赖fastjson1.2.7编译出了一个jar包,fastjson中有一个类SerializeConfig,这个类继承了一个put(Object k,Object v)的方法,所以编译出的jar包字节码里写的方法签名就是descriptor: (Ljava/lang/Object;Ljava/lang/Object;)Z。现在一个工程B使用工程A编译出的jar包,但是工程B里有fastjson的依赖1.2.60,在1.2.7之后(确切版本不知道),SerializeConfig这个类不再继承别人了,自己写了一个put(Type type, ObjectSerializer value),一个put(Object type, Object value),这时候有两个put方法。但是在fastjson1.2.60时,作者一不小心,删除了put(Object type,Object value)方法,导致运行时报NoSuchMethodError,注意时Error,不是Exception,在1.2.61,作者恢复了这个方法。 另外在研究这个错误的时候,发现有时候报NoClassDefFoundError,有时候报NoSuchMethodError,测试了一下,JVM在第一次加载出错类的时候,会报NoSuchMethodError,然后第二次再加载这个类的时候,直接报NoClassDefFoundError,不再尝试初始化了。
java.lang.NoSuchMethodError: com.alibaba.fastjson.serializer.SerializeConfig.put(Ljava/lang/Object;Ljava/lang/Object;)Z
at com.XX.bst.XX.common.annotation.XXX.<clinit>(XXXX)
at Test.lambda$main$0(Test.java:7)
at java.lang.Thread.run(Thread.java:748)
java.lang.NoClassDefFoundError: Could not initialize class XXXX.XX
at Test.lambda$main$1(Test.java:15)
at java.lang.Thread.run(Thread.java:748)