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