从文件系统动态加载OSGi捆绑包

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

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

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


有没有一种方法可以让我实用地将OSGi捆绑包交给容器,这样它就可以负责安装和启动捆绑包,然后我的UI会自动在屏幕上显示这个新捆绑包的名称

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

void install( BundleContext context, File file) throws Exception {
    Bundle b = context.installBundle( file.toURI().toString() );
    b.start();
}
您可以卸载它(如果文件已丢失):

您可以从activate或Declarative services组件的activate方法获取BundleContext。以下是推荐的方法,但在紧急情况下,您也可以使用:

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

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

最好不要使用
this.getClass()
,因为有人可能会从另一个包中将您分类;然后你得到了错误的包的上下文。这样做时,我总是使用litereal类,例如
Foo.class
。谢谢Peter。解决办法奏效了。我使用了activate服务中的bundle上下文,并且可以实际地加载其他bundle。谢谢你的回答。@Neil:这可能是错误的上下文:-)正如我所说的,这是一种万不得已的方法。
BundleContext context = FrameworkUtil.getBundle( this.getClass() ).getBundleContext();