1. 程式人生 > 其它 >Hive JDBC driver 因為jar衝突出現java.lang.NoSuchMethodError或者java.lang.AbstractMethodError導致連線hive失敗

Hive JDBC driver 因為jar衝突出現java.lang.NoSuchMethodError或者java.lang.AbstractMethodError導致連線hive失敗

用jdbc driver 2.3.9 連線hive失敗,錯誤大概如下。

java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder

java.lang.NoSuchMethodError: javax.ws.rs.core.MultivaluedMap.addAll(Ljava/lang/Object;[Ljava/lang/Object;)V

原因定位

1.首先在程式碼中加入System.out.println(當前類名.class.getClassLoader().getResource("javax/ws/rs/core/UriBuilder.class"));來定位程式載入了哪個api

2.將hive driver的依賴放在pom.xml檔案的最前面,載入

jar:file:/C:/Users/yangh/.m2/repository/com/sun/jersey/jersey-core/1.9/jersey-core-1.9.jar!/javax/ws/rs/core/UriBuilder.class
出現錯誤
java.lang.NoSuchMethodError: javax.ws.rs.core.MultivaluedMap.addAll(Ljava/lang/Object;[Ljava/lang/Object;)V
說明不能用
com/sun/jersey/jersey-core/1.9/jersey-core-1.9.jar

3.將hive driver的依賴放在pom.xml檔案的最後,載入

jar:file:/C:/Users/yangh/.m2/repository/javax/ws/rs/javax.ws.rs-api/2.0.1/javax.ws.rs-api-2.0.1.jar!/javax/ws/rs/core/UriBuilder.class
出現錯誤
java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder

說明用javax.ws.rs-api-2.0.1.jar也不行,但是我的程式中只能用其中一個。

這個時候覺得有可能是jar衝突。新增hive jdbc driver依賴時,可能自動加入了jersey-core-1.9.jar。

4.在hive jdbc driver依賴中把jersey-core-1.9.jar相關加入到inclusion,使之不載入。再次連線成功。

附pom.xml完整的hive jdbc driver依賴。

<dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>2.3.9</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.jersey</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jersey.contribs</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
View Code