在名为 Bookyard.Server 的项目中,我引用了我的另一个名为 Bookyard.Contracts 的项目。
在Eclipse for Java EE,Mars 2中,我为 Bookyard.Server 项目设置了构建路径和项目引用,如下所示:
我还将 Bookyard.Contracts 项目的 bin 文件夹添加到%CLASSPATH%
,如下所示:
但是,当我调试 Bookyard.Server 项目时,在引用合同项目的行上,它会为java.lang.NoClassDefFoundError
引发practice/bookyard/contracts/Constants
例外。
Bookyard.Server
import practice.bookyard.contracts.Constants;
...
if (!body.get("sub").toString()
.contentEquals(Constants.JWT_SUBJECT_LOGIN_REQUEST))
答案 0 :(得分:3)
由于项目之间存在依赖关系,因此需要添加Bookyard.Contracts。在项目属性的部署程序集部分
下答案 1 :(得分:1)
在对我有 8 个合作项目的 Eclipse 2020-12 工作区进行一些重组后,我遇到了 NoClassDefFoundError。这些项目相互建立(即依赖),我已经使用包资源管理器输入了依赖项 -> 右键单击项目名称 -> 构建路径 -> 配置构建路径 ... ->“项目”选项卡 ->“添加...”按钮。
背景:因为我在 Java 模块系统方面遇到了很多问题,所以我决定完全避免它并继续使用 Java 1.8,即使我有(不要问我为什么)JavaSE-13(也显示为“ JRE 13") 作为我的运行时。现在回到我的观察和最后的解决方案:
观察结果 1:我的一些项目被勾选了“启用项目特定设置”,而其他项目则没有。
观察 2:在“Java 构建路径”对话框 -> 选项卡“项目”中,我注意到有关“构建路径上的必需项目”的信息不一致。同一个较低级别的项目在使用它的一些项目中显示为“是模块化的”,而在其他项目中显示为“不是模块化的”。 (要查看有关所需项目的“是否模块化”的信息,请单击名称前面的 > 展开其行)。
解决方案(第 1 部分):对于我在工作区中的所有项目,我确保它们在项目属性的“Java 编译器”对话框中的“启用项目特定设置”中没有勾选。这样他们现在都应该共享“Java Compiler”的工作区设置。
解决方案(第 2 部分):在每个项目的“必需项目”列表中,我删除了列为“模块化”的项目的条目,并立即再次添加它们。这次操作后,我所有的8个项目中所有需要的项目都被列为“不是模块化的”。
效果:现在软件又可以正常运行了。
假设 1:可能类加载器在寻找项目中的类文件时使用不同的搜索机制,这取决于 USING 项目是否将其使用的项目声明为模块化。
假设 2:Eclipse 可能会在将较低级别项目的“模块化”信息添加到另一个项目的“必需项目”时复制它。结果是,如果“模块化”信息发生变化,依赖的项目就会不同步。如果这是真的,Eclipse 应该只是参考“模块化”信息接收事件,以防它发生变化。
我的意见:我认为这是一个错误。为什么?一个需要另一个项目的项目不应该依赖于另一个项目是否“模块化”。
答案 2 :(得分:1)
如果您的类在类的构造函数或静态块中有未捕获的异常,有时您会得到 NoClassDefFoundError。主要错误被 NoClassDefFoundError 抑制。