*************************** APPLICATION FAILED TO START *************************** Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: com.baomidou.mybatisplus.core.MybatisMapperAnnotationBuilder.parse(MybatisMapperAnnotationBuilder.java:122) The following method did not exist: 'void org.apache.ibatis.session.Configuration.parsePendingMethods(boolean)' The calling method's class, com.baomidou.mybatisplus.core.MybatisMapperAnnotationBuilder, was loaded from the following location: jar:file:/D:/App/hw/jdk-21.0.7+6/bin/fini-usermgt-server-20250813162120.jar!/BOOT-INF/lib/mybatis-plus-core-3.5.12.jar!/com/baomidou/mybatisplus/core/MybatisMapperAnnotationBuilder.class The called method's class, org.apache.ibatis.session.Configuration, is available from the following locations: jar:file:/D:/App/hw/jdk-21.0.7+6/bin/fini-usermgt-server-20250813162120.jar!/BOOT-INF/lib/mybatis-3.5.11.jar!/org/apache/ibatis/session/Configuration.class The called method's class hierarchy was loaded from the following locations: org.apache.ibatis.session.Configuration: jar:file:/D:/App/hw/jdk-21.0.7+6/bin/fini-usermgt-server-20250813162120.jar!/BOOT-INF/lib/mybatis-3.5.11.jar!/ Action: Correct the classpath of your application so that it contains compatible versions of the classes com.baomidou.mybatisplus.core.MybatisMapperAnnotationBuilder and org.apache.ibatis.session.Configuration
时间: 2025-08-13 15:58:11 浏览: 1
<think>我们面对的问题是由于MyBatis和MyBatis-Plus版本不兼容导致的`NoSuchMethodError`,具体错误信息为`NoSuchMethodError: Configuration.parsePendingMethods()V`。这个错误通常发生在运行时,当类加载器试图加载一个类的方法时,发现该方法不存在。这往往是因为依赖库的版本不匹配,导致编译时和运行时使用的库版本不一致。
### 问题分析
1. **错误根源**:`NoSuchMethodError`表明在运行时加载的某个类中缺少了编译时期存在的方法。具体到`Configuration.parsePendingMethods()`,这是MyBatis的`Configuration`类中的一个方法。在MyBatis-Plus中,它可能依赖于MyBatis的特定版本,而当前项目中使用的MyBatis版本可能过低或过高,导致该方法不存在。
2. **版本冲突**:MyBatis-Plus是在MyBatis的基础上进行增强的工具,因此它必须与特定版本的MyBatis兼容。如果项目中同时引入了MyBatis和MyBatis-Plus,且它们的版本不兼容,就会出现此类问题。
### 解决方案
#### 步骤1:检查当前依赖版本
在项目的构建文件(如Maven的pom.xml或Gradle的build.gradle)中,检查MyBatis和MyBatis-Plus的版本。例如,在Maven中:
```xml
<dependencies>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version> <!-- 注意这个版本 -->
</dependency>
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version> <!-- 注意这个版本 -->
</dependency>
</dependencies>
```
#### 步骤2:确定兼容版本
根据MyBatis-Plus官方文档,确定你使用的MyBatis-Plus版本所兼容的MyBatis版本。以下是常见的兼容关系:
| MyBatis-Plus 版本 | 所需 MyBatis 版本 |
|-------------------|-------------------|
| 3.5.x | 3.5.6+ |
| 3.4.x | 3.5.4+ |
| 3.3.x | 3.5.0+ |
如果当前MyBatis版本低于要求,则需要升级MyBatis;如果高于且不在兼容列表中,则需要降级MyBatis或升级MyBatis-Plus。
#### 步骤3:解决依赖冲突
使用Maven的依赖树命令检查是否有其他依赖传递引入了不兼容的MyBatis版本:
```bash
mvn dependency:tree -Dincludes=org.mybatis:mybatis
```
或者使用Gradle:
```bash
gradle dependencies --configuration runtimeClasspath | grep mybatis
```
如果发现多个版本的MyBatis,可以通过排除冲突的传递依赖来解决。例如,在Maven中排除某个模块传递的MyBatis:
```xml
<dependency>
<groupId>com.other.module</groupId>
<artifactId>some-artifact</artifactId>
<version>X.Y.Z</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
```
#### 步骤4:统一版本
在pom.xml中,显式指定MyBatis的版本(覆盖传递依赖的版本):
```xml
<properties>
<mybatis.version>3.5.9</mybatis.version>
<mybatis-plus.version>3.5.1</mybatis-plus.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>
```
#### 步骤5:清理和重新构建
在修改依赖后,执行清理并重新构建项目:
```bash
mvn clean install
```
或
```bash
gradle clean build
```
#### 步骤6:验证
启动Spring Boot应用,检查是否还会出现`NoSuchMethodError`。如果问题依旧,可以尝试以下额外步骤:
1. **检查依赖范围**:确保没有将MyBatis或MyBatis-Plus声明为`provided`或`test`范围,除非确实需要。
2. **检查本地仓库**:删除本地Maven仓库中对应的MyBatis和MyBatis-Plus目录,强制重新下载。
### 常见问题及解决方法
- **问题1**:升级后出现其他方法不存在错误?
可能是升级的版本跨度太大,建议逐步升级,参考官方发布的版本升级指南。
- **问题2**:项目依赖了多个模块,每个模块都引入了不同版本的MyBatis?
在父pom.xml中使用`<dependencyManagement>`统一管理版本。
- **问题3**:使用Spring Boot时,其内部可能已经管理了MyBatis的版本?
查看Spring Boot的依赖管理,确定其默认管理的MyBatis版本。例如,Spring Boot 2.7.x默认管理MyBatis 3.5.9。如果需要覆盖,可以在`<properties>`中设置:
```xml
<properties>
<mybatis.version>3.5.10</mybatis.version>
</properties>
```
### 示例配置
以下是一个使用Spring Boot、MyBatis和MyBatis-Plus的兼容配置示例(Spring Boot 2.7.x):
```xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
<mybatis-plus.version>3.5.1</mybatis-plus.version>
</properties>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- 其他依赖 -->
</dependencies>
```
注意:这里没有显式引入MyBatis,因为`mybatis-plus-boot-starter`已经包含了它,且版本是兼容的。但如果你需要指定MyBatis的版本,可以显式引入并覆盖。
### 结论
通过以上步骤,你应该能够解决因MyBatis和MyBatis-Plus版本不兼容导致的`NoSuchMethodError`。关键点在于确保两个库的版本兼容,并且项目中没有多个冲突的版本存在。
§§相关问题§§
1. 如何查看Spring Boot管理的第三方依赖的默认版本?
2. MyBatis-Plus与Spring Boot的版本兼容关系是怎样的?
3. 如何解决Maven依赖传递导致的版本冲突问题?
4. 除了版本冲突,还有哪些原因会导致`NoSuchMethodError`?</think>### 解决 MyBatis 与 MyBatis-Plus 版本冲突导致的 NoSuchMethodError
#### 问题分析
`NoSuchMethodError: Configuration.parsePendingMethods()` 错误表明:
1. **版本不兼容**:MyBatis 核心库与 MyBatis-Plus 版本存在冲突
2. **依赖冲突**:项目中存在多个 MyBatis 核心库版本
3. **方法签名变更**:MyBatis 3.5.0+ 修改了 `Configuration` 类的方法签名[^4]
#### 解决方案(分步骤)
##### 步骤1:检查依赖树
```bash
# Maven 项目
mvn dependency:tree -Dincludes=org.mybatis
# Gradle 项目
gradle dependencies --configuration runtimeClasspath | grep mybatis
```
检查输出中是否存在多个 MyBatis 核心版本(如 3.4.x 和 3.5.x 共存)
##### 步骤2:强制统一版本(Maven 示例)
```xml
<properties>
<!-- 使用 MyBatis-Plus 推荐的兼容版本 -->
<mybatis.version>3.5.10</mybatis.version>
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
</properties>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
<!-- 排除冲突的 MyBatis 核心 -->
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 显式引入统一版本 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
```
##### 步骤3:Gradle 解决方案
```gradle
configurations.all {
// 强制使用指定版本
resolutionStrategy {
force 'org.mybatis:mybatis:3.5.10'
force 'org.mybatis:mybatis-spring:3.0.1'
}
}
dependencies {
implementation('com.baomidou:mybatis-plus-boot-starter:3.5.3.1') {
exclude group: 'org.mybatis', module: 'mybatis'
exclude group: 'org.mybatis', module: 'mybatis-spring'
}
implementation 'org.mybatis:mybatis:3.5.10'
implementation 'org.mybatis:mybatis-spring:3.0.1'
}
```
##### 步骤4:验证兼容性组合
推荐使用官方验证的兼容组合:
| Spring Boot | MyBatis-Plus | MyBatis 核心 |
|-------------|--------------|--------------|
| 2.7.x | 3.5.3.1 | 3.5.10 |
| 3.0.x | 3.5.3.2 | 3.5.13 |
| 3.2.x | 3.5.5 | 3.5.15 |
##### 步骤5:清理构建缓存
```bash
# Maven
mvn clean install -U
# Gradle
gradle clean build --refresh-dependencies
```
#### 常见问题排查
1. **检查传递依赖**:
```bash
mvn dependency:tree -Dincludes=org.mybatis:mybatis
```
查看是否有其他库(如 PageHelper)引入了旧版 MyBatis
2. **解决 Bean 冲突**:
在配置类添加:
```java
@Bean
@ConditionalOnMissingBean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> {
// 空实现避免方法缺失
};
}
```
3. **检查注解处理器**:
确保 Lombok 版本 ≥ 1.18.30(旧版与 MyBatis 3.5+ 存在兼容问题)
#### 验证方案
创建测试类验证 Configuration 方法:
```java
@SpringBootTest
class MyBatisVersionTest {
@Test
void checkConfigurationMethods() throws Exception {
Configuration config = new Configuration();
// 验证存在 parsePendingMethods 方法
Method method = config.getClass().getMethod("parsePendingMethods");
assertNotNull(method);
}
}
```
#### 典型错误场景修复
**场景**:同时使用 PageHelper 和 MyBatis-Plus
```xml
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
<exclusions>
<!-- 排除旧版 MyBatis -->
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
```
> **关键提示**:MyBatis 3.5.0 重构了内部 API,任何直接依赖 `mybatis` 且版本 < 3.5.0 的库都可能引发此问题[^4]。
阅读全文
相关推荐



















