【问题标题】:java.lang.AbstractMethodError running a webapp in Eclipse with jetty.java.lang.AbstractMethodError 在 Eclipse 中使用 jetty 运行 webapp。
【发布时间】:2009-07-24 00:47:31
【问题描述】:

我正在 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 编译器中泛型的错误(这个类确实使用泛型)但是这个基类/接口在我们的代码库中一遍又一遍地重新实现,而且这个类总是有问题。

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

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

更新:

有问题的类是实现GenericDAO 的众多类之一,其中通用接口定义为:

public interface GenericDAO<T, TList> 

失败的方法是:

public T findById(Integer integer) throws APIException;   

【问题讨论】:

  • 基类或接口将参数声明为什么;整数,还是链上的东西,比如 Serializable?我想知道它是否正在为参数生成需要更高级别(如可序列化)的代码,但它正在获取整数并且不知何故没有意识到它实现了可序列化。
  • 是否需要用 super 或 extends 声明 id 参数的类型?例如,公共抽象类 BaseDao>注意,我只是在黑暗中刺伤和猜测。
  • Lumpynose - 这可能是一个解决方案,我会尝试一下,但是还有 30 多个其他类实现了这个接口并且它们工作正常。

标签: java eclipse jetty


【解决方案1】:

尝试重新构建您的代码。

我猜你有一个 DAO 接口,并且接口和 impl 的签名略有不同,以至于编译器看不到接口完全由具体的 impl 类实现。也许 Eclipse 不同步。

如果这不起作用,请查看 Eclipse 是否允许您从接口方法导航到具体实现。如果不能,那就是编译器告诉你的线索。

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

如果您认为这是编译器的问题,请查看错误列表。

如果您没有在列表中看到错误,请假设您是问题所在。很多人使用它;很久以前就发现并修复了一个严重的错误。

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

假设您首先、最后并始终是问题所在。

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

这是我讨厌 Eclipse 的另一个原因。如果你的故事属实,我会更高兴成为一名 IntelliJ 用户。

问题:您是否正在实施IBM's generic DAO?

【讨论】:

  • 我同意,如果这是一个问题,我会在网上找到更多关于它的信息。我的指针在 eclipse 中说它有问题是我可以导航代码并且一切都很好,我可以从命令行编译然后在 eclipse 中运行(使用 sun 编译器的类)而不更改任何内容并且它可以工作。在我对需要 eclipse 重新编译它的类进行更改之前,代码运行良好。
  • @duffymo 我知道它是一个旧线程,但我遇到了同样的错误并使用 IBM 通用 DAO。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 你说得对,在运行时导航给了我没有源的类,但我可以在编译时正确导航。
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      查看您的类路径。
      接口名称可能在不同包中的类路径中重复;并且那个 Eclipse 自动导入了错误的包。

      当它发生时我花了很多时间把头发扯掉/+:

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

      【讨论】:

        【解决方案6】:

        @Override 注解有什么帮助吗?如果您可以将其转换为编译时错误,您可能可以获得有关该问题的更多信息。

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

        【讨论】:

          【解决方案7】:

          只需清理项目,然后 maven 构建项目。错误消失了。作为初学者
          eclipse,我觉得IDE就像个孩子,要耐心面对不稳定。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-02-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-20
            • 2012-08-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多