[行业前沿] 如何解决ServiceComb开发微服务时遇到的依赖冲突?

本帖最后由 打得一拳开免得百拳来 于 2018-4-16 17:02 编辑

基于SpringBoot开发的微服务引入对ServiceComb的依赖后,本地IDE可以运行应用,但是一部署到云上就报ConfigurationSpringInitializer初始化失败
  1. main] ationConfigEmbeddedWebApplicationContext 550 : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ´org.apache.servicecomb.config.ConfigurationSpringInitializer#0´ defined in URL [jar:file:/home/apps/service-test-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/foundation-config-0.5.0.B019.jar!/META-INF/spring/cse.bean.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.servicecomb.config.ConfigurationSpringInitializer]: Constructor threw exception; nested exception is java.lang.AbstractMethodError: io.netty.util.concurrent.MultithreadEventExecutorGroup.newChild(Ljava/util/concurrent/ThreadFactory;[Ljava/lang/Object;)Lio/netty/util/concurrent/EventExecutor;
复制代码

定位思路:
1、IDE可以运行说明代码没有问题,可能是打包或者依赖包存在冲突
2、通过jar -jar启动,发现同样异常,基本确定是依赖冲突
3、参考ServiceComb社区的“使用maven管理负责依赖关系的技巧”,进行排查spring-boot、SpringCloud版本, 问题未解决
4、通过mvn clean dependency:tree 分析,对比引入ServiceComb前后依赖的变化,发现rocketmq-client引入netty-all这个包
1.png

原因:netty只能引入一个版本,ServiceComb已经引入了netty相关包,这个netty-all包含了所有的版本,这才导致多版本冲突

解决方案:
在pom.xml添加排除netty-all
  1. <dependency>
  2.     <groupId>org.apache.rocketmq</groupId>
  3.     <artifactId>rocketmq-client</artifactId>
  4.     <version>${rocketmq.version}</version>
  5.     <exclusions>
  6.         <exclusion>
  7.             <groupId>io.netty</groupId>
  8.             <artifactId>netty-all</artifactId>
  9.         </exclusion>
  10.     </exclusions>
  11.         </dependency>
复制代码
总结:NoSuchMethodError、ConfigurationSpringInitializer等异常,多半是不同版本的jar包混在一起导致的冲突