bug现场谜之困在“init”方法上的那些时间!

bug现场谜之困在“init”方法上的那些时间!

💡 原文中文,约4900字,阅读约需12分钟。
📝

内容提要

在将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错误?

开发者需注意编译时和运行时依赖的一致性,确保方法定义未发生变化。

🏷️

标签

➡️

继续阅读