我正在研究eclipse中的一个项目,当我使用jetty插件启动时会给我一个
java.lang.AbstractMethodError:
au.com.mycopmpany.impl.MyClassDAOImpl.findById(Ljava/lang/Integer;)Ljava/lang/Object;.
此文件在Eclipse中编译良好,代码正在实现错误所述的方法。从我的阅读中,这个错误表明“在运行时”JVM找到一个没有实现此方法的类。
但我可以向您保证,MyClassDAOImpl
肯定会使用正确的签名实施findById
方法。
这似乎是Eclipse编译器中的一个错误;我可以通过从命令提示符运行maven package
然后在Eclipse中运行应用程序来解决问题。
似乎Eclipse编译器存在与此类相关的某种错误。我在网上读过一些关于Eclipse编译器中泛型错误的东西(这个类确实使用了Generics),但是这个基类/接口在我们的代码库中反复重复实现,这个类总是有问题。 / p>
有没有人知道解决方法,或者更好的是,解决了这个问题?
我每次都可以复制此异常,因此如果Eclipse编译器开发人员阅读此内容并且这是一个已知问题,请随时与我联系以获取有关追踪问题的帮助。
更新
有问题的类是许多实现GenericDAO
的类之一,其中Generic接口定义为:
public interface GenericDAO<T, TList>
有问题的方法是失败的:
public T findById(Integer integer) throws APIException;
答案 0 :(得分:6)
尝试重建代码。
我猜你有一个DAO接口,接口和impl的签名略有不同,编译器看不到接口是由具体的impl类完全实现的。也许Eclipse不同步。
如果这不起作用,请查看Eclipse是否允许您从接口方法导航到具体实现。如果它不能,那就是强化编译器告诉你的线索。
检查您的CLASSPATH。也许您认为由JVM加载的impl不是。
如果您认为编译器存在问题,请检查错误列表。
如果您没有在列表中看到错误,请假设您遇到了问题。很多人都喜欢它;一个严重的错误很久以前就已被发现和修复。
清理Jetty部署 - WAR和所有临时文件。重建和重新部署。也许Jetty持有旧版本的.class文件,这可以解释为什么它在命令行上工作,而不是在你部署到网络时。
假设你是第一个,最后一个,也是永远的问题。
更新:有没有办法切换Eclipse使用的JDK?你能指出一个Sun JDK吗?
这是我厌恶Eclipse的另一个原因。你的故事,如果是真的,会让我更高兴成为IntelliJ用户。
问题:您是否正在实施IBM's generic DAO?
答案 1 :(得分:1)
尝试禁用内部编织:( persistence.xml中的eclipselink.weaving.internal=false
)
答案 2 :(得分:0)
我知道你已经说过你可以导航代码并且所有检查都没问题,但你是否尝试过在调试时导航?如果你在调用findById之前中断,然后介入,你是否会进入你的Impl类?这可能会给你一些关于可能的类路径混合的提示......
答案 3 :(得分:0)
你说它使用Sun编译器从命令行运行良好所以我假设Eclipse和Sun编译器都将它们的类输出到同一个目录中?
我遇到类似的问题,在使用Eclipse和Sun编译器时,保持类文件同步似乎存在问题。 Eclipse使用自己的内置编译器而不是Sun编译器,这将为相同的代码生成不同的类文件(例如,串行版本UID不匹配)。
我找到的最佳解决方案是为Eclipse和Sun编译器使用单独的bulid文件夹。这样你的源码如果总是同步但类文件不能相互冲突。
答案 4 :(得分:0)
查看你的类路径。
接口名称可能在不同包中的类路径中重复;并且eclipse自动导入了错误的包。
我花了很多时间在发生时撕掉我的头发/ +:
如果您已有解决方案,请在此处发布吗?
答案 5 :(得分:0)
@Override注释是否有任何帮助?如果可以将此转换为编译时错误,则可能能够获得有关该问题的更多信息。
完全限定相关文件中的相关类名也可能是一个好主意。
答案 6 :(得分:0)
只需清理项目,然后maven构建项目。错误消失了。作为初学者
为了日食,我认为IDE就像一个孩子,你应该有耐心去面对不稳定。