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

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

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

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

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

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

  • Config Admin位于捆绑包中,而不在主jar中,并且捆绑包未按任何特定顺序安装
  • Main类对它安装的bundle一无所知,更不用说特定的service.pid了。

更新:

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

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

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

org.osgi.framework.BundleException: Unresolved constraint in bundle  [14]: Unable to resolve 14.0: missing requirement [14.0] osgi.wiring.package; (&(osgi.wiring.package=)(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包? 或者出了什么问题?

与往常一样,注册服务…接收包(和任何其他包)可以搜索服务并读取属性。 由于您是框架启动程序,因此您可以通过从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)文件定义配置然后读取它并更新Configuration Admin非常容易(实际上已经完成了)。

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

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

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

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

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

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

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

  • 配置管理服务: http : //www.liquid-reality.de/x/G4Be
  • 元类型服务: http : //www.liquid-reality.de/x/KoBe