NoClassDefFoundError org/springframework/jdbc/core/Connectio



我卡住了,即使我从 Gradle 依赖项中排除了与 JDBC 相关的任何内容,我也会收到此错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/jdbc/core/ConnectionCallback
at java.lang.Class.getDeclaredMethods0(Native Method)
... (skipped)
Caused by: java.lang.ClassNotFoundException: org.springframework.jdbc.core.ConnectionCallback
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
... (skipped)

堆栈跟踪仅包含 Gradle、Java 和 JUnit 的内部类。我不明白哪个类在运行时需要 JDBC 驱动程序。

我运行gradle integrationTestintegrationTest是我的自定义 Gradle 任务。我试图创建一个最小的、可重现的示例并解决这个问题。我创建了一个类似但较小的 gradle 项目,我在其中使用了这个任务和一些关键依赖项,并且效果很好(我无法重现此错误,所以我无法与您共享小代码,抱歉(。我认为这意味着我的自定义任务integrationTest工作正常,问题出在主项目的传递依赖项中。

我尝试了gradle dependencies | grep jdbc并排除了 1 个名称中提到 jdbc 的库。在此之后,问题仍然存在。

我尝试将新的依赖项添加到主项目的测试范围:

integrationTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc'

在此之后,问题就消失了。但我不喜欢这个解决方案,因为它看起来像一个解决方法,我想找到这个问题的根本原因。主项目的测试模块不需要连接到关系数据库(只有 Mongo(来完成它的工作,所以它在运行时应该不需要 JDBC 驱动程序。右?

请帮我调试这个。

当我将项目从MySQL迁移到MongoDB时,我遇到了同样的错误。 我有一个测试类注释了

import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
// other imports ...
@DataJpaTest
@RunWith(SpringRunner.class)
class SomeIntegrationTestIT {
// ...
}

当我将注释(和导入(替换为

import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
// other imports ...
@DataMongoTest
@RunWith(SpringRunner.class)
class SomeIntegrationTestIT {
// ...
}

错误消失了。

最新更新