为什么我部署的eclipse插件会抛出NoClassDefFoundError异常?

时间:2016-10-14 17:08:10

标签: java eclipse eclipse-plugin noclassdeffounderror

我要求并回答这个问题,以免我将来再次陷入这个老鼠洞。

我正在建立一个基于eclipse IDE的跨平台软件开发环境,大约有40个插件。当我安装最新的每晚构建并在我的Linux测试系统上进行一些测试时,应用程序在我执行某个操作时开始抛出可怕的java.lang.NoClassDefFoundError。我的Windows安装没有发生这种情况。它在Linux或Windows上的开发环境中没有发生。此操作及其背后的代码是新的,因此我们的自动化测试套件尚未涵盖。

抛出异常的插件试图访问另一个插件中的静态类方法,但未能找到该类。我试过的事情:

  1. 首先想到:静态初始化器由于某种原因失败了!不。我可以看到其他插件在失败之前访问这个静态类和方法(通过将我的调试器附加到我的产品的已安装实例并逐步执行代码)。

  2. 它从其他插件工作的事实消除了其他常见的失败原因,没有正确导出包。它已正确导出。

  3. 我倾注了我的插件依赖列表,将它们与能够访问有问题的类的插件进行比较,但没有成功。所有依赖关系都被考虑在内。

  4. 我深入了解了我的MANFEST.MF。我改用了#34; Required-Bundle" to" Import-Package"在MANIFEST.MF。这给我带来了新的问题,所以我恢复了这个改变。一切都很好看。

  5. 我的build.properties看起来不错。没有太多在那里出错。这与我的MANFIEST.MF一致。

  6. 我在已安装的实例上解构了我的插件,以确保该类确实存在。它是。

  7. 一切都配置正确。所有的一切!

    我倾注了许多相关的SO问题和博客文章,但没有一个提供有效的解决方案或任何其他洞察问题。

    下一步是开始迭代我的夜间构建,找到问题首次出现的构建。一旦我确定了该构建,我就可以从前一天开始迭代所有提交,进行完整构建,然后安装以查找破坏它的提交。

    我提前10天开始,每晚安装一次。一直到我的测试环境中失败的构建。他们中的每一个都有效。为什么?。请参阅下面的答案(或提交给您自己的答案)。

1 个答案:

答案 0 :(得分:1)

在测试新的eclipse IDE构建时,请确保从一个全新的不存在的工作空间目录开始并使用" -clean"命令行参数,用于刷新从先前安装中幸存的任何缓存。

发生故障是因为我(1)在启动应用程序之前未能删除我之前的工作区目录; (2)没有使用" -clean"命令行参数,用于删除相关的缓存信息; (3),甚至" -clean"可能还不够,我还删除了整个应用程序目录(反过来,删除了'配置'目录,其中的所有缓存数据可能都没有"清理"由& #34; -clean"命令行参数)。

我一直在重构一些类名,以获得更有意义的名字。当我使用现有环境运行产品时,产品使用缓存数据,获取已重命名的类的旧名称,并且无法解析它。 (您可能认为看到旧名称是一个很好的线索,但不幸的是,我尝试的第一件事就是撤消类名重构,从而恢复以前的名称。所以错误报告了正确的名称,但是,我怀疑,有一种没有解决的签名。)

当然,最佳做法是在测试时始终以新工作区开始。我多年来一直在做Eclipse IDE开发,我对此很了解。但是昨天我忘记了(因为我的Windows安装没有因为某种原因遭受同样的错误这一事实没有帮助)。你偶尔会忘记......它会咬你。