我编写了一个试图创建默认HBaseConfiguration的应用程序,但是当我将应用程序打包为jar时,它将无法正常工作,因为它试图使用127.0.0.1的zookeeper而不是我{中指定的那个{1}}。该应用程序可以删除到这样的东西:
/etc/hbase/conf/hbase-site.xml
当我使用以下命令运行它时,它可以正常工作:
object TestUtil extends App {
val hbaseTable = new HTable(HBaseConfiguration.create, "tableName")
println(hbaseTable)
}
如果我将其打包为jar并使用 CLASSPATH=`hbase classpath` java fully.qualified.name.TestUtil
调用它,则会出现以下错误:
CLASSPATH='hbase classpath' java -jar TestUtil.jar
我检查了日志,可以看到它正在尝试连接到Zookeeper的127.0.0.1,这与我 org.apache.hadoop.hbase.ZooKeeperConnectionException: HBase is able to connect to ZooKeeper but the connection closes immediately.
中的zookeeper配置不同。即使我在命令行中明确设置了jar,jar似乎也忽略了我的类路径。
如何在执行jar时让JVM尊重我的类路径?
答案 0 :(得分:3)
使用java -jar
启动JVM时,生成的环境不会从外部CLASSPATH
变量中看到类路径中的文件。它改为使用classpath from the MANIFEST file。
假设您不想在清单中对依赖项的路径进行硬编码,您可以通过以下方式解决此问题:
-jar
开关和main()
作为参数指定类。例如:
CLASSPATH=/path/to/my.jar:`hbase classpath` java fully.qualified.MainClass
这与HBase的hbase
shell脚本使用的方法相同。看看line 332。
只要您的JAR不包含hbase-site.xml
,此方法就会导致JVM从类路径加载hbase-site.xml
。