JavaAPI连接Hbase遇到NoClassDefFoundError时的辛酸解决过程
使用Maven搭建JavaAPI连接Hbase项目,运行时出现了如下异常:
java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/protobuf/generated/MasterProtos$MasterService$BlockingInterface
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:228)
at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:218)
at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:119)
at hbase.GeetingStarted.main(GeetingStarted.java:21)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$BlockingInterface
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 18 more
几经确认代码无误后,把目标转向了版本号问题上:
本机安装了hadoop2.7.7+hbase1.3.1
pom.xml:
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-protocol</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.6</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
刚开始感觉没什么毛病,通过各种百度,404网站查找相似bug的前人,并没有什么解决方案,只是跟着加入了zookeeper的配置项,加入了protobuf配置项,抛出的异常是NoSuchMethod(实际上跟标题的错误是一样的)。
然后就想着会不会是hbase1.3.1跟hadoop2.7.7版本不兼容,要不试试其他的Hbase版本吧。
在我准备痛下杀手删除Hbase时,身边的大佬过来了!他跟我说pom中配置的hbase的版本不一定要跟实际安装的版本一致!他用的是1.4.3版本,于是我就这样尝试了!然后就神奇地没报错并且正常运行了!!!(此异常花了我一天多时间研究,打算放弃的情况下被救了一命!)
最终pom.xml文件配置如下:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-protocol</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.6</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
</dependencies>
这位大佬还跟我说了一下,java连接mysql用的还是5.1版本呢,可是装的mysql是5.6版本啊,所以。。这真的是个坑。。。