添加Orika Mapper后Spring Boot+Jersey应用启动失败问题
看来你遇到了Spring DevTools和Orika结合时的类加载冲突问题,这个IncompatibleClassChangeError本质是类加载器不一致或者Orika依赖版本冲突导致的,我帮你梳理下问题根源和解决办法:
问题根源
你的v-c包通过spring-devtools.properties配置了restart.include.orika=/orika-core.*\.jar,让Spring DevTools的RestartClassLoader加载Orika核心包。但v-c里的转换器类(比如AentityBdtoConverter)却是由DevTools的另一个BaseClassLoader加载的——这就导致转换器实现的Mapper接口,和你在Web应用配置类中使用的Mapper接口,虽然全限定名一样,但属于不同类加载器加载的类,JVM会判定为不兼容,抛出这个错误。
具体解决方案
1. 调整Spring DevTools的类加载配置
修改v-c包中src/main/resources/META-INF/spring-devtools.properties的配置,确保Orika和v-c包被同一个类加载器加载:
# 把v-c包也加入重启类加载器的包含列表 restart.include.vc=/v-c.*\.jar # 保持Orika的包含配置,这样两者会被同一个类加载器加载 restart.include.orika=/orika-core.*\.jar
或者,如果你不需要Orika参与DevTools的热重启,可以改为排除Orika,让它由基础类加载器加载:
restart.exclude.orika=/orika-core.*\.jar
2. 强制统一Orika依赖版本
确保Web应用和v-c包使用的Orika版本完全一致。在Web应用的pom.xml中显式声明Orika依赖,避免依赖传递带来的版本不一致:
<dependency> <groupId>ma.glasnost.orika</groupId> <artifactId>orika-core</artifactId> <version>1.5.4</version> <scope>compile</scope> </dependency>
可以执行mvn dependency:tree命令查看依赖树,确认没有其他版本的Orika被引入。
3. 简化Orika配置类的写法
你的转换器已经继承了CustomMapper,其实不需要再通过classMap().customize()来配置,直接注册转换器到MapperFactory即可,这样能避免不必要的配置错误:
@Configuration public class OrikaConfiguration { @Bean public MapperFacade mapperOrika() { final MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build(); // 直接注册自定义转换器 mapperFactory.registerMapper(new AentityBdtoConverter()); // 其他转换器也用同样方式注册 return mapperFactory.getMapperFacade(); } }
4. 临时禁用DevTools排查问题
如果以上方法都没效果,可以先移除Spring DevTools的依赖,重启应用看看是否正常。如果禁用后问题消失,那肯定是DevTools的类加载机制导致的,回到方案1调整配置即可。
验证步骤
- 执行
mvn clean install -U清理Maven缓存并重新构建 - 重启Spring Boot应用,观察异常是否消失
- 若仍有问题,检查应用的类加载路径,确保Orika的jar只存在一个版本,且相关类由同一个类加载器加载
内容的提问来源于stack exchange,提问作者Fourat




