是什么导致“java.lang.IncompatibleClassChangeError:vtable stub”?在我们的应用程序中,我们已经看到这个错误随机出现并且很少(到目前为止只有两次,我们运行了很多)。即使重新启动应用程序,使用相同的jvm / jar而不重建也不容易重现。
至于我们的构建过程,我们清理所有类/ jar并重建它们,因此它与其他人遇到的问题不同,他们在一个类中进行了更改并且没有重新编译其他一些依赖类。
这与IncompatibleClassChangeError相关的其他一些问题不同 - 它们都没有提到“vtable stub”。实际上,在搜索“IncompatibleClassChangeError”vtable stub“”时,谷歌搜索结果出乎意料的很少。
修改
答案 0 :(得分:2)
JVM字节码世界中的ABI破坏。查看Javadoc: “当某个类定义发生不兼容的类更改时抛出。当前正在执行的方法所依赖的某个类的定义已经发生了变化。“
要查找的罪魁祸首是对静态最终文字值的更改,因为这些值在字节代码中被复制为“优化”。编辑:这可以像库升级的结果一样简单,我所知道的唯一修复是干净的重建。
答案 1 :(得分:0)
看起来您已经更改了类定义(即添加额外的属性或更奇怪的东西),并且在运行以前使用的对象时变得不兼容。
也许你正在某处存储对象实例(db文件系统)然后解组那些旧对象定义,就会发生错误。
过去发生在我身上。
例如:
class Employee implements Serialiable {
String name;
String lastName;
String address;
... etc
}
该应用程序可以运行几周,并且一些对象以序列化版本存储在文件系统中。
稍后由于应用程序更改,我们必须将地址添加为对象:
class Employee implements Serializable {
String name;
String lastName;
Address address;
}
然后重构以前存储的对象并尝试使它们适合这个新描述,错误 可能 加注(在我的情况下,它更多比这更复杂但是它可以帮助你朝这个方向看。