3

我有一个带有自定义 Main 类的自定义 jar,它启动 OSGi 框架并安装/启动捆绑包。这个主 jar 还包括一个属性文件。

目标:我有一个包 A,它应该以某种方式获取主 jar 的这个属性文件的属性。

我的第一次尝试是在包 A 中定义一个组件(使用 Apache Felix SCR/声明式服务)并在其激活方法中检索属性。到目前为止,这有效,我得到了@Property-annotation 中指定的默认值。

但是我现在如何将属性文件的属性传递给这个组件呢?

将参数传递给 OSGi 应用程序 提到使用 Config Admin,但我如何在 Main 类中使用它?

  • Config Admin 在一个包中,而不是在主 jar 中,并且这些包没有按任何特定顺序安装
  • Main 类对它安装的包一无所知,更不用说特定的 service.pid。

更新:

我现在正在尝试@vizier 建议的方法(它不使用 Config Admin,因此没有提到的问题):

  • 在主jar(系统包)中定义一个服务接口
  • 提供一个实现,它读取属性文件(属性文件在同一个jar中)
  • 导出包含此服务接口的包 X
  • 包 A 然后可以导入包 X 并例如使用声明性服务引用服务

但在我的捆绑包 A 中,我得到:

org.osgi.framework.BundleException: Unresolved constraint in bundle <bundle A> [14]: Unable to resolve 14.0: missing requirement [14.0] osgi.wiring.package; (&(osgi.wiring.package=<package X>)(version>=0.1.0)(!(version>=1.0.0)))
    at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3826)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1868)
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1191)
    at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:295)
    at java.lang.Thread.run(Thread.java:722)

即使Manifest文件中的Export-Package添加了一些自定义包,系统捆绑包是否只导出osgi包?或者出了什么问题?

4

4 回答 4

2

和往常一样,注册一个服务......接收包(和任何其他包)可以搜索服务并读取属性。由于您是框架启动器,因此您可以通过从 Launching API 获得的框架对象注册您想要的任何服务。

在 bnd(tools) 我有一个启动器。它使用 OSGi Launcher API 来创建包,类似于您所描述的。我将命令行参数作为启动器服务的属性传递。以https://github.com/bndtools/bnd/blob/master/biz.aQute.launcher/src/aQute/launcher/Launcher.java为例。

当然,您也可以通过 Framework 对象获取 Configuration Admin 服务并使用它来注册配置。在 JSON(或者,我敢说是 XML)文件中定义配置,然后读取并更新 Configuration Admin 非常容易(实际上已经完成)。

于 2012-05-23T06:19:46.747 回答
1

最简单的可能是将带有属性文件的 jar 制作成一个片段,以 bundle A 作为宿主。

然后属性将位于包的类路径中,并且可以轻松读取。

于 2012-05-22T17:00:39.287 回答
1

您也可以使包含主类的 jar 成为 OSGi 包,并在启动期间将此包与其他包一起安装。然后,您可以使用多种技术让其他包访问您的 jar 中包含的属性,例如:

  • 提供一个类来访问属性并使用模块依赖进行集成(Export-package/Import-package)
  • 提供访问属性的服务
  • 使用配置管理员
于 2012-05-22T16:26:01.317 回答
0

我们在 Apache Karaf 中有一个类似的案例。在那里,我们只需将属性设置为 java System 属性并将它们提供给框架。然后这些在 OSGi 包上下文中作为属性可用。所以这对于适用于整个平台的属性来说是很好的。查看karaf starter的项目:http: //svn.apache.org/viewvc/karaf/trunk/main/

如果您需要用户包中的属性,那么使用配置管理服务会更好。它将用户包从检索属性的机制中分离出来,并且还允许在运行时进行更新。还有一个元类型服务,它允许定义属性的结构和含义,从而允许以漂亮的形式来编辑属性。

我在我的网站上的两个教程中描述了如何使用配置管理服务:

于 2012-05-23T10:27:48.553 回答