我有一个带有自定义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类中使用它?
我现在正在尝试@vizier建议的方法(它不使用Config Admin,因此没有提到的问题):
但在我的捆绑中我得到了:
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包?或者出了什么问题?
答案 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中包含的属性,例如:
答案 2 :(得分:1)
最简单的方法可能是使用属性文件将jar作为片段,将bundle A作为主机。
然后属性将在bundle的类路径上,并且可以很容易地读取。
答案 3 :(得分:0)
我们在Apache Karaf中有类似的案例。我们只需将属性设置为java System属性,并将它们提供给框架。然后,它们可作为OSGi包上下文中的属性使用。所以对于整个平台的属性来说这很好。查看karaf启动项目:http://svn.apache.org/viewvc/karaf/trunk/main/
如果您需要用户捆绑包中的属性,那么使用配置管理服务会更好。它将用户包与检索属性的机制分离,并允许在运行时进行更新。还有一个元类型服务,它允许定义属性的结构和含义,允许用于编辑属性的漂亮表单。
我在网站上的两个教程中描述了如何使用配置管理服务: