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 作业:
Job1
:对测试系统执行完全干净的构建,在Java中编写,然后对DSL执行完全干净的构建,最后执行测试用例。这是一项很长的 运行 工作(约 5 小时)。
Job2
:对测试系统执行完全干净的构建,然后在其上执行其他操作。不涉及 DSL。这是一份较短的工作(约 1 小时)。
我们有一个用于所有作业的 Maven 存储库。此外,被测组件的某些部分是两个组件之间接口的一部分。
考虑到时间戳,发生了以下情况:
Job1
执行了两个组件的完整构建,并启动了包含多个测试用例的测试套件,执行持续约半小时。
- 垃圾收集器可能会清除尚未使用的组件。
Job2
开始构建,同时也重新构建了界面部分,包括被Job1
. 的垃圾回收器扫掉的部分
Job1
到达一个使用已经扫出的接口组件的测试用例
解决方案如下:我们将Job2
移到了更早的时间;现在它在 Job1
开始测试之前完成了工作。
我们有一个奇怪的问题。我们正在使用自动测试工具。 DSL 是在 Scala 中实现的。我们用这个工具测试的系统是用Java编写的,两个组件之间的接口是RMI。确实,自动测试工具的接口部分也是Java(剩下的就是Scala)。我们拥有这些组件源代码的完全控制权。
我们已经有上千个测试用例。我们每晚在 Linux 服务器上使用 Jenkins 自动执行一次这些测试用例。问题是我们偶尔会收到 java.lang.NoClassDefFoundError
异常。这通常发生在尝试从 Scala 代码访问 Java 工件时。
如果我们手动执行相同的测试用例,或检查下一个晚上的结果 运行,那么问题通常会自动解决,但有时它会在完全不同的地方再次发生。在一些 运行s 的情况下,根本不会出现这样的问题。最大的问题是错误不可重现;此外,在自动 运行 的情况下,我们几乎没有任何关于确切情况的信息,只有测试用例和日志。
有人遇到过这样的问题吗?你知道如何进行吗?任何提示或信息都会有所帮助,而不仅仅是解决问题。谢谢!
我找到了错误的原因(99% 确定)。我们有以下 2 个 Jenkins 作业:
Job1
:对测试系统执行完全干净的构建,在Java中编写,然后对DSL执行完全干净的构建,最后执行测试用例。这是一项很长的 运行 工作(约 5 小时)。Job2
:对测试系统执行完全干净的构建,然后在其上执行其他操作。不涉及 DSL。这是一份较短的工作(约 1 小时)。
我们有一个用于所有作业的 Maven 存储库。此外,被测组件的某些部分是两个组件之间接口的一部分。
考虑到时间戳,发生了以下情况:
Job1
执行了两个组件的完整构建,并启动了包含多个测试用例的测试套件,执行持续约半小时。- 垃圾收集器可能会清除尚未使用的组件。
Job2
开始构建,同时也重新构建了界面部分,包括被Job1
. 的垃圾回收器扫掉的部分
Job1
到达一个使用已经扫出的接口组件的测试用例
解决方案如下:我们将Job2
移到了更早的时间;现在它在 Job1
开始测试之前完成了工作。