今天公司项目发布上线,可是上线后商品列表不能请求了,看日志错误如下。
Caused by: java.lang.NoSuchFieldError: TYPE
at com.cm.admin.service.goods.GoodsTagService.listAllTagBySpu(GoodsTagService.java:216)
at com.cm.admin.service.goods.GoodsTagService$$FastClassBySpringCGLIB$$c44fbbaa.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
来来来,抓重点,NoSuchFieldError,定位到指定行,这个字段是有的,而且在本地和测试服务器都正常。如果这个字段不存在的话,应用应该是不能启动的,那么是什么原因呢?这里先用个demo复现这个错误。
首先,我们创建两个类,代码如下:
- TestClass.java
public class TestClass {
public static String str = "Hello By TestClass";
}
- Example.java
public class Example {
public static void main(String[] args){
System.out.println(TestClass.str);
}
}
用命令行编译并运行,命令如下
javac Example.java
java Example
输出如下:
Hello By TestClass
一切正常,并未出现NoSuchFieldError。
接下来我们把TestClass类做如下修改,注释第二行。
public class TestClass {
//public static String str = "Hello By TestClass";
}
只编译TestClass类,而不把Example类编译,然后运行程序
javac TestClass.java
java Example
运行结果如下:
Exception in thread "main" java.lang.NoSuchFieldError: str
at Example.main(Example.java:3)
好了,NoSuchFieldError出现了。
要处理这个错误,我们要清除所有的 .class 文件,重新编译,以保证所有的文件都是最新的。
如果这个错误运行时还存在,可能是编译时引用的依赖和运行时的版本不同,这里就要检查各个路径、版本是否错误了。
maven项目一般执行 mvn clean 就可以了。
项目已成功上线,当时原因除了这个外,还有docker镜像也不是最新的(docker部署),两错误一起,多绕了点弯,这里就不细说了。