我有一个带有自定义主类的自定义 jar,它启动 OSGi 框架并安装/启动包。此主 jar 还包含一个属性文件。
目标:我有一个包 A,它应该以某种方式获取主 jar 的这个属性文件的属性。
我的第一次尝试是在 bundle A 中定义一个组件(使用 Apache Felix SCR/声明式服务)并在其激活方法中检索属性。到目前为止,这是有效的,我得到了@Property-annotation 中指定的默认值。
但是我现在如何将属性文件的属性传递给这个组件呢?
Passing arguments to OSGi application 提到使用 Config Admin,但如何在 Main 类中使用它?
- Config Admin 在 bundle 中,不在主 jar 中,并且 bundle 没有按任何特定顺序安装
- 主类对其安装的包一无所知,更不用说特定的 service.pid 了。
更新:
我现在正在尝试@vizier 建议的方法(它不使用 Config Admin,因此没有提到的问题):
- 在主 jar(系统包)中定义一个服务接口(interface)
- 提供一个实现,读取属性文件(属性文件在同一个jar中)
- 导出包含该服务接口(interface)的包X
- bundle 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 包?或者出了什么问题?
最佳答案
一如既往,注册服务……接收包(和任何其他包)可以搜索服务并读取属性。由于您是框架启动器,因此您可以通过从 Launching API 获得的框架对象注册您想要的任何服务。
在 bnd(tools) 中我有一个启动器。它使用 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 非常容易(只是真正做到了)。
关于java - OSGi:将参数传递给特定的包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10705750/