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 integrationTest我integrationTest的自定义 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驱动程序。正确的?
请帮我调试一下。
当我将项目从 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)
错误消失了。
| 归档时间: |
|
| 查看次数: |
8633 次 |
| 最近记录: |