1. 程式人生 > >maven 由於傳遞依賴導致的引入低版本jar包導致classnotfind異常問題解決

maven 由於傳遞依賴導致的引入低版本jar包導致classnotfind異常問題解決

maven匯入jar包時,可能由於不同jar包之間依賴了不同版本的另外的jar包,會導致classnotfind異常。

舉個我遇到的例子:

        <dependency>             <groupId>org.glassfish.jersey.containers</groupId>             <artifactId>jersey-container-netty-http</artifactId>             <version>2.26</version>         </dependency>

        <dependency>             <groupId>org.apache.hbase</groupId>             <artifactId>hbase-client</artifactId>             <version>2.1.0<</version>         </dependency>

如上,我引入上面兩個包時,

Channel server = NettyHttpContainerProvider.createHttp2Server(BASE_URI, new APIApplication(), null);

此時執行上面的建立啟動 Netty HTTP/2 server 沒有問題,正常。

由於專案中需要將hbase-client版本換成1.2.6,問題就來了。

        <dependency>             <groupId>org.glassfish.jersey.containers</groupId>             <artifactId>jersey-container-netty-http</artifactId>             <version>2.26</version>         </dependency>

        <dependency>             <groupId>org.apache.hbase</groupId>             <artifactId>hbase-client</artifactId>             <version>1.2.6<</version>         </dependency>

如上,pom中需要改為上面這樣。此時在我的Activator中

Channel server = NettyHttpContainerProvider.createHttp2Server(BASE_URI, new APIApplication(), null);

會報java.lang.ClassNotFoundException: io.netty.handler.codec.http.HttpServerUpgradeHandler$UpgradeCodecFactory not found異常。

原因是1.2.6中依賴了netty-all 4.0.幾的一個版本,而jersey-container-netty-http2.2.6中依賴的是netty-all 4.1.5.Final這個版本。所以需要手動引入4.1.5這個版本。

即在pom檔案中加入:

<dependency>     <groupId>io.netty</groupId>     <artifactId>netty-all</artifactId>     <version>4.1.5.Final</version> </dependency>

至此,問題解決。

問題分析步驟:

1、程式啟動時丟擲異常java.lang.ClassNotFoundException: io.netty.handler.codec.http.HttpServerUpgradeHandler$UpgradeCodecFactory not found,所以可以從這個類所在的jar包開始分析;

2、查詢jar包所依賴的其他jar。可參考https://blog.csdn.net/qq_35893120/article/details/78436455網上這篇文章,然後找到引用的不同版本的jar, 這裡就需要分析一下,看是哪個導致的classnotfind異常。  很麻煩,但我目前還不清楚有什麼好的辦法。(大神看到可以回覆一下)

3、手動引入高版本的jar。

水平有限,出錯之處 請拍磚指正。