【问题标题】:Why can't my jar see the HBase configuration from the environment?为什么我的 jar 看不到环境中的 HBase 配置?
【发布时间】:2012-03-09 20:11:04
【问题描述】:

我编写了一个尝试创建默认 HBaseConfiguration 的应用程序,但是当我将应用程序打包为 jar 时,它无法正常工作,因为它正在尝试使用 127.0.0.1 的 zookeeper,而不是我的 @ 中指定的那个987654321@。应用程序可以被剥离成这样的:

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

当我使用以下命令运行它时,它工作正常:

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

如果我将其打包为 jar 并使用 CLASSPATH='hbase classpath' java -jar TestUtil.jar 调用它,则会收到以下错误:

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

我检查了日志,可以看到它正在尝试连接到 Zookeeper 的 127.0.0.1,这与我的 /etc/hbase/conf/hbase-site.xml 中的 zookeeper 配置不同。 jar 似乎忽略了我的类路径,即使我在命令行上明确设置了它。

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

【问题讨论】:

    标签: scala hadoop jvm classpath hbase


    【解决方案1】:

    当使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-30
      • 2016-11-17
      • 2015-03-27
      • 2015-02-28
      • 1970-01-01
      • 2015-11-06
      • 2012-10-08
      • 2022-08-23
      相关资源
      最近更新 更多