为什么我的jar不能从环境中看到HBase配置?

时间:2012-03-09 20:11:04

标签: scala hadoop jvm classpath hbase

我编写了一个试图创建默认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尊重我的类路径?

1 个答案:

答案 0 :(得分:3)

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

假设您不想在清单中对依赖项的路径进行硬编码,您可以通过以下方式解决此问题:

  1. 除了
  2. 之外,还要在类路径中运行要运行的JAR
  3. 未使用-jar开关和
  4. 使用main()作为参数指定类。
  5. 例如:

     CLASSPATH=/path/to/my.jar:`hbase classpath` java fully.qualified.MainClass
    

    这与HBase的hbase shell脚本使用的方法相同。看看line 332

    只要您的JAR不包含hbase-site.xml,此方法就会导致JVM从类路径加载hbase-site.xml