SpringBoot3+MyBatis+JDK17项目java -jar启动失败问题
问题
基于Spring Boot 3.1.5、MyBatis 3.0.3和JDK17的项目,本地IDE运行正常,执行mvn spring-boot:run启动也无异常,但用java -jar myjar.jar启动时,MyBatis映射文件解析报错,提示结果映射集合存在重复键,可jar包中仅包含一份该映射XML文件。
依赖配置
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.5</version> </parent> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency>
报错信息
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'URL [jar:file:C:\Development\workspaces\sts\myapp\target\myjar-1.0.0-SNAPSHOT.jar!/BOOT-INF/classes/mybatis/mappers/Order.xml]'. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains key myapp.repotracer.mapper.OrderMapper.mapper_resultMap[orderResultMap]_collection[sfcs]
排查与解决方向
- 验证jar包内资源唯一性:执行
jar tf myjar.jar命令列出jar中所有文件,确认mybatis/mappers/Order.xml是否只存在一份。部分场景下打包插件会将不同目录下的同名资源都纳入jar包,比如多模块项目中其他模块的资源目录。 - 修正Mapper扫描路径配置:检查Spring Boot配置中的
mybatis.mapper-locations,如果配置为classpath*:mybatis/mappers/*.xml,classpath*会扫描所有classpath下的匹配文件(包括依赖jar中的),改为classpath:mybatis/mappers/*.xml(去掉前缀的星号),限制仅扫描当前项目的资源。 - 检查ResultMap定义:仔细核对
Order.xml中的orderResultMap,确认是否存在重复定义的ResultMap,或者嵌套的sfcs集合是否有重复绑定的情况。IDE可能会忽略一些语法细节,但打包后的解析校验更严格。 - 清理打包缓存:执行
mvn clean package重新打包,避免target目录中残留的旧文件导致资源重复。 - 升级依赖版本:尝试将MyBatis Spring Boot Starter升级至最新稳定版(如3.0.5),排查是否为版本兼容性问题导致的解析异常。
内容的提问来源于stack exchange,提问作者Davide D.
相关产品推荐
相关产品推荐

