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>