maven - hbase 和 osgi - 找不到 hbase-default.xml

标签 maven hadoop osgi hbase

由于 hbase 不能作为 osgi 化的包使用,但我设法使用 maven felix 插件(hbase 0.92 和相应的 hadoop-core 1.0.0)创建了包,并且两个包都在 OSGi 中启动:)

还将 hbase-default.xml 添加到生成的包中。在生成的 osgi-jar 中,当我打开它时,结构如下所示:

  • 组织/
  • 元信息
  • hbase-default.xml

这是通过 <Include-Resource>@${pkgArtifactId}-${pkgVersion}.jar!/hbase-default.xml</Include-Resource> 实现的

当我真正想要连接到 hbase 时,问题出现了。找不到 hbase-default.xml,因此我无法创建任何配置文件。

hbase osgi 包在另一个 osgi-bundle 中使用,该 osgi-bundle 应该用于获取 hbase 连接和查询数据库。此 osgi-bundle 由 RCP 应用程序使用。

我的问题是,我必须将我的 hbase-default.xml 放在哪里,以便在启动 bundle 时找到它?或者为什么它没有意识到该文件已存在?

感谢您的任何提示。

-- 编辑

我找到了一个反编译器,所以我可以查看执行配置加载的源代码(hadoop-core 不通过 maven 提供任何源代码),我现在看到使用了 Threads contextClassLoader(如果不可用, Configuration 类本身的 classLoader),所以在我看来它找不到资源,但是,根据描述,它应该也检查父级(但谁是 OSGi 环境中的父级?)?

我测试从应该使用 hbase 的 OSGi-bundle 中获取资源,我在其中将 hbase-default.xml 添加到创建的 jar 文件中(见上文),当我获取线。当我进一步研究代码时,我意识到没有办法为 HBaseConfiguration 设置类加载器(尽管可以为“简单的”hadoop-Configuration 设置类加载器,HBaseConfiguration 继承自,但是创建过程HBaseConfiguration 不允许这样做,因为它只是在 create() 方法中创建一个新对象。

我真的希望你知道如何启动和运行它:)

最佳答案

Thread.currentThread().setContextClassLoader(HBaseConfiguration.class.getClassLoader());

确保 HBaseConfiguration 加载到您的 OSGI bundle.hbase 中的类将使用线程上下文类加载器,以加载资源(hbase-default.xml 和 hbase-site.xml)。设置 TCCL 将允许您加载默认值并在以后覆盖它们。

关于maven - hbase 和 osgi - 找不到 hbase-default.xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10191512/

相关文章:

oracle - com.oracle :ojdbc6 in version 11. 2.0.3 有什么特别之处?

hadoop - Hadoop排序以处理海量数据

hadoop - Hbase:需要适合cloudera-quickstart-vm-5.4.2-0的jar文件

eclipse - 尝试在 Equinox 中以编程方式安装包时出现 nullPointerException

maven - 如何在gradle中迭代项目的依赖项

java - 使用 gradle 生成 OSGI-INF/serviceComponent.xml

java - Spring/Hibernate (JUnit4) 中的集成测试问题

java.lang.NoClassDefFoundError : org/springframework/web/client/ResponseErrorHandler 错误

java - 在 maven 中配置 JaCoCo 时遇到问题

hadoop - 云应用程序是什么样的?