使用springboot2.3.0集成dubbo2.7.7时,启动报如下错误:
java.lang.NoSuchMethodError: org.apache.catalina.Context.addServletMapping(Ljava/lang/String;Ljava/lang/String;)V
at org.apache.dubbo.remoting.http.tomcat.TomcatHttpServer.<init>(TomcatHttpServer.java:68) ~[dubbo-2.7.7.jar:2.7.7]
初步看到是类TomcatHttpServer缺少方法,所以先定位一下这个类,可以查到如下信息:
可以看到是dubbo2.7.7包含了这个类,类中引用的Tomcat版本缺少组件方法,再根据context继续排查下当前tomcat使用的版本。
说明当前使用的9.0.35存在问题,在pom依赖中看下依赖关系:
当项目中使用,dependencyManagement时,如下所示,需注意版本配合,
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Apache Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
可以进去看下,dubbo中tomcat的依赖版本是8.5.31,在springboot依赖中tomcat依赖的版本是9.0.3,显然版本冲突导致tomcat最终使用9.0.3,解决方案很简单,如果是这种dependencyManagement形式的,直接在pom中定义目标artifactId即可。
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.5.31</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-annotations-api</artifactId>
<version>8.5.31</version>
</dependency>
如果使用将springboot作为parent的,直接设置属性即可
<tomcat.version>8.5.31</tomcat.version>
用最新的东东,难免会出现些小问题,仔细阅读错误日志,很容易排查到根源所在,切不可操之过急。
觉得有用,点个关注,【码农小麦】公众号同。