如何根據錯誤排查問題: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>

用最新的東東,難免會出現些小問題,仔細閱讀錯誤日誌,很容易排查到根源所在,切不可操之過急。

覺得有用,點個關注,【碼農小麥】公衆號同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章