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

标签 java osgi

我有一个带有自定义主类的自定义 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/

相关文章:

java - Spring - 项目未运行但没有错误

java - 如何通过makefile从命令行向java程序传递参数

java - OSGi 包与 javax.json.JsonException for MoXy

osgi - Jitsi 包含用于定制的外部 jar

java - ADOBE CQ5 JCR - 如何使用节点属性对查询生成器结果进行排序/排序

java - 在我的 Java 程序中实现搜索框

java - 当页面需要登录时,如何用Java下载HTML源代码?

servlets - 在单个 JVM 实例中部署 Clojure 应用程序

java - 当我不知道启动时调用了哪个类的main方法时,是否可以在main方法中设置断点?

transactions - Camel 事务异常处理