【问题标题】:java.lang.NoClassDefFoundError for a class within a referenced project引用项目中的类的 java.lang.NoClassDefFoundError
【发布时间】:2016-08-31 06:16:39
【问题描述】:

在我的名为 Bookyard.Server 的项目中,我引用了我的另一个名为 Bookyard.Contracts 的项目。

在 Eclipse for Java EE, Mars 2 中,我为 Bookyard.Server 项目设置了 Build PathProject References,如下所示:

我还将 Bookyard.Contracts 项目的 bin 文件夹添加到 %CLASSPATH%,如下所示:

但是,当我调试我的 Bookyard.Server 项目时,在它引用合同项目的那一行,它会为 practice/bookyard/contracts/Constants 引发 java.lang.NoClassDefFoundError 异常。

Bookyard.Server

import practice.bookyard.contracts.Constants;
...
if (!body.get("sub").toString()
       .contentEquals(Constants.JWT_SUBJECT_LOGIN_REQUEST))

【问题讨论】:

  • 尝试在部署程序集中添加您的依赖项目
  • @JekinKalariya 谢谢。就 Java 而言,我是一个完整的初学者。我不知道该怎么做。您能否将我指向一个解释如何做到这一点的页面?
  • 它很简单,您可以在 Eclipse 属性快照中看到部署程序集标签,只需在此处添加与在构建路径中添加相同的项目
  • 关于部署组装的进一步参考在这里genuitec.com/products/myeclipse/learning-center/basics/…
  • @JekinKalariya 谢谢。那很简单。但它现在告诉我,我的合同项目中有错误。这不是问题。我会弄清楚它们是什么。仅有的。我是生态系统和工具的新手,请告诉我如何检查构建错误。当我构建我的项目时,Console 窗口不会报告构建进度。我在哪里可以看到?我想这是一个新问题,但如果你能告诉我,它会有所帮助。

标签: java eclipse


【解决方案1】:

由于项目之间存在依赖关系,因此您需要添加 Bookyard.Contracts。在项目属性的 Deployment Assembly 部分下

【讨论】:

    【解决方案2】:

    如果您的类在类的构造函数或静态块中有未捕获的异常,有时您会收到 NoClassDefFoundError。 NoClassDefFoundError 抑制了主要错误。

    【讨论】:

      【解决方案3】:

      在对我有 8 个合作项目的 Eclipse 2020-12 工作区进行了一些重组后,我得到了 NoClassDefFoundError。这些项目相互构建(即依赖),我使用包资源管理器输入了依赖项->右键单击项目名称->构建路径->配置构建路径...->“项目”选项卡->“添加...”按钮。

      背景:因为我在 Java 模块系统中遇到了很多问题,所以我决定完全避免它并继续使用 Java 1.8,即使我有(不要问我为什么)JavaSE-13(也显示为“ JRE 13") 作为我的运行时。现在回到我的观察和最后的解决方案:

      观察 1:我的一些项目被勾选“启用项目特定设置”,而其他项目没有。

      观察 2:在“Java 构建路径”对话框 -> 选项卡“项目”中,我注意到有关“构建路径上的必需项目”的信息不一致。相同的较低级别项目在使用它的一些项目中显示为“模块化”,而在其他项目中显示为“不是模块化”。 (要查看有关所需项目的“模块化与否”信息,请单击名称前面的 > 展开其行。

      解决方案(第 1 部分):对于工作区中的所有项目,我确保它们在项目属性的“Java 编译器”对话框中的“启用项目特定设置”中没有勾选。所以他们现在应该共享“Java 编译器”的工作区设置。

      解决方案(第 2 部分):在每个项目的“必需项目”列表中,我删除了列为“模块化”的项目的条目并立即再次添加它们。经过这个操作,我所有的 8 个项目中所有需要的项目都被列为“不是模块化的”。

      效果:现在软件又可以正常运行了。

      假设 1:类加载器在项目中查找类文件时可能使用不同的搜索机制,这取决于 USING 项目是否将其使用的项目声明为模块化。

      假设 2:当 Eclipse 添加到另一个项目的“必需项目”时,可能 Eclipse 复制了较低级别项目的“模块化”信息。效果是,如果“模块化”信息发生变化,则依赖项目不同步。如果这是真的,Eclipse 应该只是参考“模块化”信息接收事件以防它发生变化。

      我的意见:我认为这是一个错误。为什么?一个需要另一个项目的项目不应依赖于另一个项目是否“模块化”。

      【讨论】:

        猜你喜欢
        • 2012-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-27
        • 1970-01-01
        • 2021-05-06
        相关资源
        最近更新 更多