使用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>
用最新的東東,難免會出現些小問題,仔細閱讀錯誤日誌,很容易排查到根源所在,切不可操之過急。
覺得有用,點個關注,【碼農小麥】公衆號同。