2012-03-09 65 views
1

我写了一个试图创建默认HBaseConfiguration的应用程序,但是当我将应用程序打包为jar时,它将无法正常工作,因为它试图使用127.0.0.1的zookeeper,而不是我的/etc/hbase/conf/hbase-site.xml中指定的那个。该应用程序可以被剥离下来是这样的:为什么我的jar看不到环境中的HBase配置?

object TestUtil extends App { 
    val hbaseTable = new HTable(HBaseConfiguration.create, "tableName") 
    println(hbaseTable) 
} 

当我运行这个使用下面的命令正常工作:

CLASSPATH=`hbase classpath` java fully.qualified.name.TestUtil 

如果我将其打包作为一个罐子,用CLASSPATH='hbase classpath' java -jar TestUtil.jar叫它再我得到以下错误:

org.apache.hadoop.hbase.ZooKeeperConnectionException: HBase is able to connect to ZooKeeper but the connection closes immediately. 

我检查了日志,可以看到,它正在尝试连接到127.0.0.1的动物园管理员,这是从zooke不同eper配置在我的/etc/hbase/conf/hbase-site.xml。即使我明确地将它设置在命令行上,该jar似乎仍在忽略我的类路径。

如何让JVM在执行jar时遵循我的类路径?

回答

3

当使用java -jar启动JVM时,生成的环境在外部CLASSPATH变量的类路径中看不到文件。它改为使用classpath from the MANIFEST file

假设你不想硬编码清单中的路径依赖项,你可以解决这个问题的:

  1. 将要在另外的类路径运行JAR,
  2. 不使用-jar开关,和
  3. 指定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

相关问题