首页 文章

从文件系统动态加载OSGi包

提问于
浏览
2

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

我该如何实现这一目标?我已经尝试将OSGi包作为JarInputstream读取并读取bundle激活器完全限定的类路径并尝试使用Class.forName(“”)实例化它并输入到BundleActivator接口 . 但是在启动时,它将bundle上下文作为start方法的参数 .

有没有办法我可以实际上将OSGi包捆绑到容器中,以便它将负责安装和启动捆绑包,然后我的UI将自动在显示中获取这个新的捆绑包名称 .

1 回答

  • 4

    假设您要加载文件,您可以安装捆绑包:

    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();
    }
    

    您可以从activate或Declarative服务组件的activate方法获取BundleContext . 这些是推荐的方法,但在严峻的情况下,您也可以使用:

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

    虽然方便,它绕过了您可能希望在将来使用的某种机制,因此以推荐的方式获取上下文要好得多

相关问题