如何根据错误排查问题:java.lang.NoSuchMethodError: org.apache.catalina.Context.addServletMapping

使用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>

用最新的东东,难免会出现些小问题,仔细阅读错误日志,很容易排查到根源所在,切不可操之过急。

觉得有用,点个关注,【码农小麦】公众号同。

猜你喜欢

转载自blog.csdn.net/weixin_43275277/article/details/106532813