Scala 中的零星 java.lang.NoClassDefFoundError

Sporadic java.lang.NoClassDefFoundError in Scala

我们有一个奇怪的问题。我们正在使用自动测试工具。 DSL 是在 Scala 中实现的。我们用这个工具测试的系统是用Java编写的,两个组件之间的接口是RMI。确实,自动测试工具的接口部分也是Java(剩下的就是Scala)。我们拥有这些组件源代码的完全控制权。

我们已经有上千个测试用例。我们每晚在 Linux 服务器上使用 Jenkins 自动执行一次这些测试用例。问题是我们偶尔会收到 java.lang.NoClassDefFoundError 异常。这通常发生在尝试从 Scala 代码访问 Java 工件时。

如果我们手动执行相同的测试用例,或检查下一个晚上的结果 运行,那么问题通常会自动解决,但有时它会在完全不同的地方再次发生。在一些 运行s 的情况下,根本不会出现这样的问题。最大的问题是错误不可重现;此外,在自动 运行 的情况下,我们几乎没有任何关于确切情况的信息,只有测试用例和日志。

有人遇到过这样的问题吗?你知道如何进行吗?任何提示或信息都会有所帮助,而不仅仅是解决问题。谢谢!

我找到了错误的原因(99% 确定)。我们有以下 2 个 Jenkins 作业:

  1. Job1:对测试系统执行完全干净的构建,在Java中编写,然后对DSL执行完全干净的构建,最后执行测试用例。这是一项很长的 运行 工作(约 5 小时)。
  2. Job2:对测试系统执行完全干净的构建,然后在其上执行其他操作。不涉及 DSL。这是一份较短的工作(约 1 小时)。

我们有一个用于所有作业的 Maven 存储库。此外,被测组件的某些部分是两个组件之间接口的一部分。

考虑到时间戳,发生了以下情况:

  1. Job1 执行了两个组件的完整构建,并启动了包含多个测试用例的测试套件,执行持续约半小时。
  2. 垃圾收集器可能会清除尚未使用的组件。
  3. Job2开始构建,同时也重新构建了界面部分,包括被Job1.
  4. 的垃圾回收器扫掉的部分
  5. Job1到达一个使用已经扫出的接口组件的测试用例

解决方案如下:我们将Job2移到了更早的时间;现在它在 Job1 开始测试之前完成了工作。