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。
水平有限,出錯之處 請拍磚指正。