JUnit 测试失败并出现 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 在 Tycho 环境

Posted

技术标签:

【中文标题】JUnit 测试失败并出现 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 在 Tycho 环境【英文标题】:JUnit test fails with java.lang.ClassNotFoundException: com.mysql.jdbc.Driver on Tycho environment 【发布时间】:2013-04-22 23:23:01 【问题描述】:

我有一个很奇怪的情况。我有一组 Eclipse 插件项目,我使用 tycho 和 maven 来构建它们。我在其中一个项目中使用了 JDBC 驱动程序,并且我有一个测试插件来测试这个项目。由于 com.mysql.jdbc 插件在 eclipse p2 存储库中不可用(而且我们没有自己的 p2),我导入了 jdbc 插件并创建了一个 OSGi 插件并将依赖项添加到我的本地插件中。

我有多个 Eclipse 工作区。只有在创建测试和 jdbc 插件的第一个工作区中,当我使用 eclipse run as -> Junit test 命令运行它们时,junit 测试才有效。当其他人甚至我签出源代码并尝试在不同的工作区中运行测试时,会抛出此异常:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

我也尝试过使用 tycho 集成测试(运行 mvn integration-test),但这也不起作用,我仍然遇到同样的异常。我试着搜索了很多,但我找不到答案。

更新:我认为这不是第谷问题。我只是尝试创建基于 com.jdbc.mysql jar 的 eclipse 插件。我在上面创建的工作区工作正常。但是,一旦我提交代码并将项目导入另一个工作区,测试就会停止工作。两个工作区的所有设置都是一样的,一个正在工作,另一个得到 ClassNotFound 异常!

【问题讨论】:

我有一个非常相似的问题,我以为我错过了在 Tycho/EclipseRCP 环境中使用 Junit 的一些东西。所以上周,我问了这个问题:***.com/questions/16166866/… 现在我对这个问题有了更多的暗示,我在 oberlies 的回答下简要解释了作为评论。我认为系统/配置级别有问题。此外,我认为以下有关配置的所有答案只有在您根本无法运行测试时才有帮助。 【参考方案1】:

Tycho 根据测试包的传递依赖关系计算 OSGi 运行时。 您可能对 mysql 驱动程序包没有设计时依赖项(而仅依赖于它实现的 JDBC 接口)

尝试在 mysql jdbc 驱动程序包上添加测试运行时依赖项。 请参阅 http://wiki.eclipse.org/Tycho/FAQ#How_to_add_a_undeclared_dependency.3F__.28e.g..2C_OSGi_declarative_service.29 了解如何执行此操作。

【讨论】:

我尝试添加对 JDBC 的依赖,但不幸的是并没有解决问题。【参考方案2】:

OSGi 运行时中的ClassNotFoundExceptions 表明 OSGi 清单中的导入和/或导出声明中有问题。最常见的情况是,一个包声称要导出某个包,但实际上并没有该包的二进制文件/类文件。

在 Tycho 构建中,如果在 build.propertiesbin.includes 属性中没有条目 .,则很容易发生这种情况。

【讨论】:

谢谢@oberlies,但我之前检查过这些。包被导出并且构建属性是正确的。但我仍然得到 classNotFoundException!

以上是关于JUnit 测试失败并出现 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 在 Tycho 环境的主要内容,如果未能解决你的问题,请参考以下文章

Spring DAO 测试失败 - 说“需要 JUnit 4.12 或更高版本”

Spring JUnit 测试用例失败

使用 h2 进行 Spring Junit 测试 - 找不到表

为啥 JUnit 测试异常总是失败? [复制]

Junit测试失败:HttpMessageConversion错误

Selenium 可以截取 JUnit 测试失败的屏幕截图吗?