内容提要
在将Tomcat 8.5的war包迁移到Jetty 9.4.19时,出现NoSuchMethodError错误,表明运行时找不到对应的方法。这通常是由于编译时和运行时依赖不一致造成的。尽管使用javap工具确认类存在构造方法,但Jetty版本升级导致方法定义变化。开发者需注意普通方法与构造方法的区别,以避免类似问题。
关键要点
-
在将Tomcat 8.5的war包迁移到Jetty 9.4.19时,出现NoSuchMethodError错误,表示运行时找不到对应的方法。
-
NoSuchMethodError通常是由于编译时和运行时依赖不一致造成的。
-
编译时依赖是指构建工具在编译时CLASSPATH中依赖的类,运行时依赖是指JVM实例运行时加载的类。
-
使用javap工具确认类存在构造方法,但Jetty版本升级导致方法定义变化。
-
开发者需注意普通方法与构造方法的区别,以避免类似问题。
-
Jetty在9.3升级到9.4时,将WebSocketServerFactory的init方法由普通方法改为构造方法。
-
异常堆栈信息中,.<init>()表示构造方法的调用,而.init()表示普通方法的调用。
延伸问答
在迁移war包时遇到NoSuchMethodError错误的原因是什么?
NoSuchMethodError错误通常是由于编译时和运行时依赖不一致造成的。
如何确认类的构造方法是否存在?
可以使用javap工具确认类的构造方法是否存在。
Jetty 9.4与9.3版本在WebSocketServerFactory的init方法上有什么变化?
Jetty在9.3升级到9.4时,将WebSocketServerFactory的init方法由普通方法改为构造方法。
如何定位JVM加载的类的jar包?
可以使用JVM参数-verbose:class输出加载class的jar包绝对路径,或通过Java代码获取类的CodeSource。
普通方法和构造方法在异常堆栈信息中如何区分?
普通方法用.init()表示,构造方法用.<init>()表示。
在开发中如何避免NoSuchMethodError错误?
开发者需注意编译时和运行时依赖的一致性,确保方法定义未发生变化。