升级Spring Boot2.7.1报IllegalAccessError访问org.bson.BSON异常
问题根因
这个异常是MongoDB生态依赖版本严重不匹配、和Spring Boot 2.7.1内置依赖规则冲突导致的:
- Spring Boot 2.7.1 官方依赖管理中默认绑定的Spring Data MongoDB版本为3.4.x,匹配的MongoDB Java驱动为4.x系列。手动声明的
1.9.1.RELEASE版spring-data-mongodb、3.11.0版mongo-java-driver完全不在官方版本兼容矩阵内,类路径下会同时存在多个版本的bson、mongo核心类。 - 报错中
java.lang.IllegalAccessError: tried to access class org.bson.BSON from class com.mongodb.DBObjectCodec的直接触发原因是:3.x版本mongo驱动的DBObjectCodec类需要访问同包下的org.bson.BSON类,但类加载器加载到了4.x版本的bson包中的BSON类,该类在4.x版本中修改了访问权限,最终触发非法访问错误。 - Tomcat 7的类加载优先级策略会优先加载Web应用lib目录下的资源,多版本同品类jar包共存时加载顺序不可控,直接导致该问题在部署阶段稳定复现,本地构建时因为IDE类加载顺序差异不会触发报错。
解决方案
按以下顺序操作即可修复:
- 删除pom.xml中手动添加的
mongo-java-driver、spring-data-mongodb两个依赖,不要手动指定这两个组件的版本,直接引入Spring Boot官方提供的MongoDB starter,由Spring Boot的依赖管理自动对齐兼容版本:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
- 排查依赖树,清理所有传递引入的旧版本Mongo相关依赖。在项目根目录执行以下命令输出所有Mongo、bson相关依赖:
mvn dependency:tree | grep -E "mongo|bson"
如果输出结果中存在3.x版本的mongo-java-driver、低于3.4.x版本的spring-data-mongodb、版本号不一致的bson包,在引入对应组件的<dependency>节点下添加<exclusion>规则排除这些旧版本传递依赖。
3. 部署前彻底清理Tomcat 7下的旧部署缓存:删除webapps目录下对应旧war包、war包解压生成的文件夹,清空work目录下的缓存文件,再将重新打包生成的war包放入webapps目录启动。
补充说明:Spring Boot 2.7.x系列最低兼容Servlet 3.1规范,Tomcat 7可以正常运行,如果后续需要升级到Spring Boot 3.x版本,需要将Tomcat升级至8.5及以上版本。
内容的提问来源于stack exchange,提问作者Anish Sharma
相关产品推荐
相关产品推荐

