以下是上下文:我有2个osgi产品正在运行,一个是主要软件(我们称之为'软件'),另一个是使用p2管理第一个产品的更新/安装/卸载。 (让我们称第二个'更新者')
我设法让更新程序在软件中安装一个功能,这意味着该功能已成功安装在功能目录及其在plugins目录中的捆绑包中。关于p2一切都很好,配置文件会随着新的更改而更新。
然而,它对软件没有任何影响,因为它不关心新功能
所以我在插件中添加了一些p2.inf文件和installBundle指令,这使得我的新包被添加到config.ini文件中,该文件包含要加载的包列表。
这让我非常接近胜利,因为当我重新启动软件时,我的新插件被框架加载。但是......我不想重新启动,因为osgi能够在现场安装内容,所以我不应该重启。
还在争吵,我的搜索让我发现了simpleconfigurator,它负责从文件加载bundle列表并将它们提供给框架,它将完成它所需要的一切。但它只在启动时才这样做,我没有找到任何方法或任何文档要求他在运行时刷新列表。
到目前为止,我所做的唯一解决方案是在bundle org.eclipse.equinox.simpleconfigurator上调用update()方法,然后我的bundle被识别并完美地工作。
所以现在,我有一些工作,但我想找到一个更好的解决方案,我告诉完整故事的原因是因为我很惊讶,在与p2战斗后,我还需要战斗用osgi来装载新包装。
感谢您的帮助:))
答案 0 :(得分:0)
我对p2不太熟悉。但听起来你有两个问题 - 你需要一些方法在运行时以编程方式将bundle部署到OSGi容器中和让主应用程序知道并使用这些bundle中的功能。
对于第一个问题,请查看Programmatically Start OSGi (Equinox)?
上的所选答案对于第二部分,您可以在主应用程序中使用ServiceListener - http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/ServiceListener.html来侦听实现预定义接口的服务。如果服务在运行时已注册或未注册,您的主应用程序应得到通知,并且可以做出相应的反应。
答案 1 :(得分:0)
你可以找到你的包,并调用bundle.update(InputStream输入)。 http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/Bundle.html#update(java.io.InputStream)