在Eclipse中重建已删除的类文件

时间:2011-09-07 00:14:54

标签: java eclipse class build compilation

我在项目中意外删除了一个.class(Java字节码)文件(在文件系统上,而不是使用Eclipse本身)。容易修复,对吧?只需重新构建它。但这不起作用!即使我从“项目”菜单中选择“构建项目”或“全部构建”或“自动构建”,文件系统上实际上什么也没发生,我仍然得到:

Exception in thread "main" java.lang.NoClassDefFoundError

我只是想从我已有的源代码中重新编译它!

顺便说一句,当我从“Project”菜单中选择“Clean ...”时,Eclipse也不会删除任何文件。我也尝试将项目重新导入到不同的文件夹中,但Eclipse只复制了所有.class文件,问题仍然存在。

5 个答案:

答案 0 :(得分:6)

OP在评论中回答了他自己的问题(2年半前):

  

找到解决方案:该项目所依赖的另一个项目无法编译,因为它无法清理,因为Eclipse想要删除整个项目中的.svn目录(我不知道为什么),而且它不能因为有些文件没有写入权限。我很高兴消除所有.svn数据只是为了让这个工作!谢谢你的提示。 - user690075 Sep 7' 11 at 1:25

<小时/> 关于赏金

  

这个问题没有得到足够的重视。

     

这个问题一直在浪费我的时间。

如果OP的答案没有解决您的问题,您应该在新帖子上提出一个更具体的问题,描述您的尝试以及OP的解决方案是如何进行的#39; t解决您的具体问题。

话虽如此,假设您尝试了OP发布的解决方案,可能会出现另一个问题(由于删除类文件而导致的问题)导致相同的错误。因为你对其他人的问题开始了赏金,而且你无法获得声望,我认为值得一提的是,确保你的JDK版本兼容可能是值得的。项目中使用的旧的或外部的源代码。当编译器到达代码中引用在不兼容的JDK上开发的库中定义的对象/类的某个点时,您将得到相同的错误NoClassDefFoundError,它是&#39;缺少在JDK版本中找不到的关键内部依赖项。

我会详细介绍,但由于这个问题特别是关于删除类文件时出现的错误,我觉得这样做是不对的。

答案 1 :(得分:2)

彻底清理

1)查找并删除 .eclipse 文件夹(您可以先备份它们)

2)删除相关的 .class 文件

3)如果有任何 .svn文件夹,请手动或通过svn客户端删除它们

4)不要为此使用自动构建,而是手动选择仅损坏项目并执行清理(如果存在依赖项)

如果失败,可能最好将源代码打包并重新导入为新项目。这可以避免在可能的IDE错误上浪费时间

答案 2 :(得分:2)

在更传统的语言中,程序会在启动过程中一次性加载。 Java没有这个问题,因为它采用不同的加载方法。这是变得更容易的活动之一,因为Java中的所有内容都是一个对象。请记住,每个类的已编译代码都存在于其自己的单独文件中。 在需要代码之前,不会加载该文件。通常,您可以说“在首次使用时加载类代码。”这通常是在该类的第一个对象是构造,但是当访问静态字段或静态方法时也会发生加载。

如果您无法从本地历史记录恢复。那你就失去了运气。使用源控制管理工具(如SVN或Git)可以避免下次出现此类意外情况。

如果您有源文件尝试在控制台或其他IDE中单独编译文件以及依赖项并复制该类文件让错误现在出错,请在eclipse中编辑源文件再次尝试构建。希望这不会起作用,因为即使eclipse也会忽略在构建Project时重新编译某些文件。更好的尝试。

答案 3 :(得分:1)

您确定此源文件位于项目的源集中吗?因为在这种情况下Eclipse只会编译并将其放在类路径中。右键单击 Package Explorer 中的项目,属性 - &gt; Java构建路径 - &gt;来源。封闭文件夹应该在那里,否则Eclipse不会编译它。

如果你的这个源文件曾经在源代码集中进行了编译,并且已经编译了,可以解释为什么它在你删除二进制文件之前一直在运行。

为了避免这个问题发生,我建议在 Java - &gt;中选择清理项目时刷新输出文件夹。编译器 - &gt;在项目菜单中构建自动构建...

还要确保项目编译/构建成功,否则Eclipse可能无法编译所有类。

如果它仍然没有帮助,那么您遇到问题的项目类型可能很重要:Java Project,Maven Project,Gradle Project等。

答案 4 :(得分:1)

对于那个把这个帐号排除在外的人,也许你可以将所有的更改提交到你所拥有的代码库,退出eclispe后只需删除整个工作区,然后创建一个新的工作区并重新导入所有文件到代码库中的新工作区。