测试中的 NoClassDefFoundError org/springframework/jdbc/core/ConnectionCallback

naX*_*aXa 4 java dependencies noclassdeffounderror spring-jdbc gradle

我陷入困境,即使我从 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)
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪仅包含 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'
Run Code Online (Sandbox Code Playgroud)

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

请帮我调试一下。

kas*_*tom 8

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

import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;

// other imports ...

@DataJpaTest
@RunWith(SpringRunner.class)
class SomeIntegrationTestIT {
// ...
}
Run Code Online (Sandbox Code Playgroud)

当我用以下内容替换注释(和导入)时

import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;

// other imports ...

@DataMongoTest
@RunWith(SpringRunner.class)
class SomeIntegrationTestIT {
// ...
}

Run Code Online (Sandbox Code Playgroud)

错误消失了。