OSGi:将参数传递给特定的包

时间:2012-05-22 16:03:23

标签: java osgi

我有一个带有自定义Main类的自定义jar,它启动OSGi Framework并安装/启动bundle。这个主jar还包含一个属性文件。

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

我的第一次尝试是在bundle A中定义一个组件(使用Apache Felix SCR / Declarative Services)并在其activate-method中检索属性。到目前为止,这是有效的,我得到@ Property-annotation中指定的默认值。

但是,我现在如何将属性文件的属性传递给此组件?

Passing arguments to OSGi application 提到使用Config Admin,但是如何在Main类中使用它?

  • 配置管理员位于捆绑包中,而不是在主jar中,捆绑包未按任何特定顺序安装
  • Main类对它安装的软件包一无所知,更不用说特定的service.pid了。

更新

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

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

但在我的捆绑中我得到了:

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 个答案:

答案 0 :(得分:2)

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

在bnd(工具)中我有一个发射器。它使用OSGi Launcher API创建捆绑包,类似于您描述的内容。我将命令行参数作为属性传递给Launcher服务。请查看https://github.com/bndtools/bnd/blob/master/biz.aQute.launcher/src/aQute/launcher/Launcher.java以获取示例。

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

答案 1 :(得分:1)

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

  • 提供一个用于访问属性的类,并使用模块依赖性(Export-package / Import-package)进行集成
  • 提供访问属性的服务
  • 使用Config Admin

答案 2 :(得分:1)

最简单的方法可能是使用属性文件将jar作为片段,将bundle A作为主机。

然后属性将在bundle的类路径上,并且可以很容易地读取。

答案 3 :(得分:0)

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

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

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