【问题标题】:OSGi: passing parameters to a specific bundleOSGi:将参数传递给特定的包
【发布时间】:2012-05-29 03:55:33
【问题描述】:

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

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

我的第一次尝试是在包 A 中定义一个组件(使用 Apache Felix SCR/声明式服务)并在其激活方法中检索属性。到目前为止,这有效,我得到了@Property-annotation 中指定的默认值。

但是我现在如何将属性文件的属性传递给这个组件呢?

Passing arguments to OSGi application 提到使用 Config Admin,但我如何在 Main 类中使用它?

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

更新:

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

  • 在主jar(系统包)中定义一个服务接口
  • 提供一个实现,读取属性文件(属性文件在同一个jar中)
  • 导出包含此服务接口的包 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包?还是出了什么问题?

【问题讨论】:

    标签: java osgi


    【解决方案1】:

    和往常一样,注册一个服务......接收包(和任何其他包)可以搜索服务并读取属性。由于您是框架启动器,因此您可以通过从 Launching API 获得的框架对象注册您想要的任何服务。

    在 bnd(tools) 我有一个启动器。它使用 OSGi Launcher API 来创建包,类似于您所描述的。我将命令行参数作为启动器服务的属性传递。以https://github.com/bndtools/bnd/blob/master/biz.aQute.launcher/src/aQute/launcher/Launcher.java 为例。

    您当然也可以通过框架对象获取配置管理服务并使用它来注册配置。在 JSON(或者,我敢说,XML)文件中定义配置,然后读取并更新配置管理非常容易(实际上已经完成)。

    【讨论】:

    • 是的,我认为服务方法应该可行。关于配置管理方法:如何克服我在问题中提到的问题?
    【解决方案2】:

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

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

    【讨论】:

    • 嗯,它已经是一个包(或者更好的是扩展包的框架)。它包含所有 OSGi 基类、Apache Felix 实现和一些用于启动的自定义类。我认为我不应该(或不能)以其他方式安装它。
    • 我认为前两种方法应该可行。使用方法#2,我只需要手动注册服务,因为 Felix SCR 不是主 jar 的一部分。关于方法#3:我仍然不知道如何克服我在问题中提到的问题。
    • 我现在尝试了服务方法:系统包(主 jar)现在导出带有服务接口的自定义包。但在我的包 A 中,我得到:缺少要求 [14.0] osgi.wiring.package; (&(osgi.wiring.package=)(version>=0.1.0)(!(version>=1.0.0))) 系统捆绑包是否只导出osgi包,即使添加了一些自定义包清单文件中的导出包?
    【解决方案3】:

    最简单的可能是将带有属性文件的 jar 做成一个片段,以 bundle A 作为宿主。

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

    【讨论】:

    • 我之前考虑过这个解决方案,但我认为它不适合我的情况。这些属性在 POM 中传递给自定义 Maven 扩展插件(自定义打包类型;extensions=true)。该插件处理属性,创建属性文件并将其添加到主 jar。我不认为插件应该创建一个片段作为副作用。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 2011-03-11
      • 1970-01-01
      • 2023-02-08
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多