Mongock 失败:NoClassDefFoundError org/springframework/data/mongodb/MongoDatabaseFactory

问题描述

我在 Spring Boot 应用中使用以下 pom:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.13.RELEASE</version>
    <relativePath /><!-- resolve parent from repository,refer to http://www.tomitribe.com/blog/2016/06/i-do-not-hate-apache-maven/ -->
  </parent>

<dependencies>
        <dependency>
            <groupId>com.github.cloudyrock.mongock</groupId>
            <artifactId>mongock-bom</artifactId>
            <version>4.3.8</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>com.github.cloudyrock.mongock</groupId>
            <artifactId>mongock-spring-v5</artifactId>
            <version>4.3.8</version>
        </dependency>
        <dependency>
            <groupId>com.github.cloudyrock.mongock</groupId>
            <artifactId>mongodb-springdata-v3-driver</artifactId>
            <version>4.3.8</version>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver-sync</artifactId>
            <version>4.2.2</version>
         </dependency>
         <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-mongodb</artifactId>
            <version>2.2.12.RELEASE</version>
</dependency>
</dependencies>

当我使用 java -jar my-app.jar 运行应用程序时,出现以下错误

NoClassDefFoundError org/springframework/data/mongodb/MongoDatabaseFactory

但是当我使用 -noverify 运行应用程序时,似乎一切正常

请问,有人可以帮我吗?

解决方法

这是因为版本不兼容。

正如您在此 compatibility table 中所见,您使用的 Mongock 版本与 spring-data 3.x 兼容,但您使用的是 2.x。

Mongock 为 spring-data 提供了两个驱动,mongodb-springdata-v3-driver,用于 spring-data 3.x 和 mongodb-springdata-v2-drver,用于 spring-data 2.2.X

我有几个建议:

  1. 要么将 spring-data 依赖升级到 3.x,要么使用 mongodb-springdata-v2-drver(推荐第一个)
  2. 使用依赖项管理,因此您无需为每个依赖项指定版本。你可以在春天和Mongock

有了这个,你应该解决你的问题;)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...