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