java.lang.AbstractMethodError在Eclipse中使用jetty运行webapp时出错。

java.lang.AbstractMethodError在Eclipse中使用jetty运行webapp时出错。,java,eclipse,jetty,Java,Eclipse,Jetty,我正在eclipse中进行一个项目,当我使用jetty插件启动时,它给了我一个 java.lang.AbstractMethodError: au.com.mycopmpany.impl.MyClassDAOImpl.findById(Ljava/lang/Integer;)Ljava/lang/Object;. 这个文件在Eclipse中编译得很好,代码实现了错误提到的方法。从我的阅读中,这个错误表明JVM在“运行时”发现了一个没有实现这个方法的类 但是我可以向您保证,MyClassDAO

我正在eclipse中进行一个项目,当我使用jetty插件启动时,它给了我一个

java.lang.AbstractMethodError: 
au.com.mycopmpany.impl.MyClassDAOImpl.findById(Ljava/lang/Integer;)Ljava/lang/Object;.
这个文件在Eclipse中编译得很好,代码实现了错误提到的方法。从我的阅读中,这个错误表明JVM在“运行时”发现了一个没有实现这个方法的类

但是我可以向您保证,
MyClassDAOImpl
确实使用正确的签名实现了
findById
方法

这似乎是Eclipse编译器中的一个bug;我可以通过在命令提示符下运行
maven-package
,然后在Eclipse中运行应用程序来解决这个问题

Eclipse编译器似乎有一些与此类相关的bug。我确实在网上读到了一些关于Eclipse编译器中泛型错误的文章(这个类确实使用泛型),但是这个基类/接口在我们的代码库中被一次又一次地重新实现,而这个类总是有问题

有没有人知道这个问题的解决方法,或者更好的解决方法

我每次都可以复制此异常,因此如果Eclipse编译器开发人员阅读此异常,并且这是一个已知问题,请随时与我联系以获得跟踪此问题的帮助

更新:

出现此问题的类是许多实现
GenericDAO
的类之一,其中Generic接口定义为:

public interface GenericDAO<T, TList> 

尝试重新生成代码

我猜您已经有了一个DAO接口,并且接口和impl的签名稍有不同,以至于编译器不认为接口完全由具体的impl类实现。也许Eclipse不同步了

如果这不起作用,请查看Eclipse是否允许您从接口方法导航到具体实现。如果不能,这是一条线索,可以强化编译器告诉您的内容

检查你的类路径。也许您认为JVM正在加载的impl不是

如果您认为编译器有问题,请检查错误列表

如果您在列表中没有看到bug,则假设您就是问题所在。很多人使用它;那么严重的错误早就被发现并修复了

清理Jetty部署—WAR和所有临时文件。重建和重新部署。也许Jetty保留了一个较旧版本的.class文件,这可以解释为什么它在命令行上工作,而不是在部署到web时工作

假设你是问题的第一个、最后一个,而且永远都是

更新:有没有办法切换Eclipse使用的JDK?你能指一下Sun JDK吗

这是我讨厌日食的另一个原因。如果你的故事是真的,我会更高兴成为IntelliJ用户


问题:您正在实现吗?

我知道您已经说过您可以导航代码,并且所有代码都检查正常,但是您是否在调试时尝试过导航?如果在调用findById之前中断,然后介入,您是否进入了Impl类?这可能会给您一些关于可能的类路径混淆的提示…

您说它使用Sun编译器从命令行运行良好,所以我假设Eclipse和Sun编译器都将它们的类输出到同一个目录

我也遇到过类似的问题,在使用Eclipse和Sun编译器时,保持类文件同步似乎存在问题。Eclipse使用自己的内置编译器而不是Sun编译器,这将为同一代码生成不同的类文件(例如,串行版本UID不匹配)


我找到的最好的解决方案是为Eclipse和Sun编译器使用一个单独的bulid文件夹。这样,您的源文件将始终保持同步,但类文件不会相互冲突。

查看您的类路径
接口名可能在不同的包中沿着类路径复制;eclipse自动导入了错误的包。

事情发生时,我花了很多时间把头发扯下来/+:


如果您已经有了解决方案,请也将其发布在这里好吗?

是否有任何帮助的@Override注释?如果可以将此问题转化为编译时错误,则可以获得有关此问题的更多信息


完全限定所讨论文件中的相关类名也是一个好主意。

尝试禁用内部编织:(
eclipselink.weaving.internal=false
in persistence.xml)

只需清理项目,然后maven构建项目。错误消失了。作为初学者

对于eclipse,我认为IDE就像一个孩子,你应该有耐心面对不稳定。

基类或接口声明参数是什么;整数,或者其他类似可序列化的东西?我想知道它生成的代码是否要求参数具有更高的级别(如可序列化),但它得到的是整数,并且不知何故没有意识到它实现了可序列化。是否需要使用super或extends声明id参数的类型?例如,公共抽象类BaseDaoLumpynose——这可能是一个解决方案,我会尝试,但有30多个其他类实现了这个接口,它们工作得很好。我同意,如果这是一个问题,我会在网上找到更多关于它的信息。我的指针指出eclipse中有问题,我可以导航代码,一切都很好,我可以从命令行编译,然后在eclipse中运行(使用sun编译器的类),而无需更改任何内容,它就可以工作。在我对需要eclipse重新编译的类进行更改之前,代码运行良好。@duffymo我知道这是一个旧线程,但我得到了相同的错误,并使用IBM通用DAO。你是对的,运行时导航给了我没有源代码的类,但我可以在编译时正确导航
public T findById(Integer integer) throws APIException;