所以,我在 eclipse 中工作,一切都能正确编译和运行。但是,在构建服务器的 ant 下编译时,大量测试失败并出现 NoSuchMethodError 说:
类 A 实现 B
接口 B 扩展 C
C 需要方法 getSyncID() // 用于 int 字段的标准 getter。
A.java 包含 getSyncID()
A.class 包含 getSyncID()
然而仍然抛出错误。
有谁知道这到底是怎么发生的?如何修复它。
所以,我在 eclipse 中工作,一切都能正确编译和运行。但是,在构建服务器的 ant 下编译时,大量测试失败并出现 NoSuchMethodError 说:
类 A 实现 B
接口 B 扩展 C
C 需要方法 getSyncID() // 用于 int 字段的标准 getter。
A.java 包含 getSyncID()
A.class 包含 getSyncID()
然而仍然抛出错误。
有谁知道这到底是怎么发生的?如何修复它。
当类文件彼此不同步时会发生这种情况;换句话说,一个被编译为新版本,而另一个没有。尝试从头开始清理和重建。
当类加载器发现一个类 (A) 中的方法调用另一个类 (B) 中不存在的方法时,就会出现问题。根本原因是类加载器看到的B类和编译器在编译A时看到的B类不同。
这个问题的最常见原因是@MarkPeters 说 - 您的“.class”文件与“.java”文件不同步,需要从头开始重新编译。
另一种可能性是,当您尝试运行应用程序时,您在类路径中有一些“.class”文件的旧副本。
但无论哪种方式,您都必须相信类加载器。如果它说该方法不存在,那么它不存在......在它正在加载的特定“.class”文件中。如果该方法出现在“.class”文件中,那么这表明您在类路径中较早地加载了该文件的不同版本!