由于jstorm0.9.x的版本不提供maven源下载,所以之前一直使用storm的maven配置替代。但是引用hbase后由于引用的zookeeper版本不同:storm引用了zookeeper3.3.3.jar而hbase引用了zookeeper3.4.6.jar,会导致项目启动出错。即使通过exclusions hbase的 ZooKeeper,也会在控制面板里不断的打印zookeeper连接异常。
17253 [Thread-98-SendMsgFilter-SendThread(dev07.badinfo.rcs:2181)] WARN org.apache.zookeeper.ClientCnxn - Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused: no further information
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[na:1.7.0_79]
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:739) ~[na:1.7.0_79]
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1119) ~[zookeeper-3.3.3.jar:3.3.3-1073969]
如果将storm自带的zookeeper排除掉,则会报以下异常:
Caused by: java.lang.ClassNotFoundException: org.apache.zookeeper.server.NIOServerCnxn$Factory
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:191)
at backtype.storm.zookeeper$loading__4784__auto__.invoke(zookeeper.clj:1)
at backtype.storm.zookeeper__init.load(Unknown Source)
at backtype.storm.zookeeper__init.<clinit>(Unknown Source)
... 90 more
最终找到了一个解决的办法,不引用storm,而是引用storm-core,具体的引用配置如下:
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>0.9.6</version>
</dependency>
这样可以完美解决jstorm本地调试的问题。