2

我有一个使用 OSGi 框架的模块化应用程序。这里我使用 org.eclipse.equinox.common_3.4.0 OSGi 容器。因此,现在应用程序已经在所有已安装并处于活动状态的 osgi 包的情况下运行,并且我正在 UI 上显示所有活动的 OSGi 包,通过基于一些操作循环哈希映射。现在的要求是,当应用程序已经在运行时,我想从文件系统安装一个新的 OSGi 包,方法是将这个新包提供给应用程序的 OSGi 容器,以便它启动这个包。

我该如何做到这一点?我尝试将 OSGi 包作为 JarInputstream 读取并读取包激活器完全限定的类路径,并尝试使用 Class.forName("") 实例化它并将类型转换为 BundleActivator 接口。但是在启动它时,它将捆绑上下文作为启动方法的参数。

有没有办法我可以务实地将 OSGi 捆绑包提供给容器,以便它负责安装和启动捆绑包,然后我的 UI 将自动在显示中选择这个新的捆绑包名称。

4

1 回答 1

6

假设您有要加载的文件,您可以像这样安装包:

void install( BundleContext context, File file) throws Exception {
    Bundle b = context.installBundle( file.toURI().toString() );
    b.start();
}

你可以卸载它(如果文件不见了):

void uninstall( BundleContext context, File file) throws Exception {
    Bundle b = context.getBundle( file.toURI().toString() );
    b.uninstall();
}

您从您的激活或声明式服务组件的激活方法中获取 BundleContext。这些是推荐的方法,但在极端情况下,您也可以使用:

BundleContext context = FrameworkUtil.getBundle( this.getClass() ).getBundleContext();

虽然很方便,但它绕过了您将来可能想要使用的一些机制,因此以推荐的方式获取上下文要好得多

于 2013-03-15T07:39:46.807 回答