【问题标题】:Loading of OSGi bundle dynamically from a file system从文件系统动态加载 OSGi 包
【发布时间】:2013-03-03 19:10:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: osgi osgi-bundle


    【解决方案1】:

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

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

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

    【讨论】:

    • 最好不要使用this.getClass(),因为有人可能会从另一个包中继承你;然后你得到错误的包的上下文。这样做时,我总是使用文字类,例如Foo.class.
    • 谢谢彼得。解决方案奏效了。我使用了激活服务中的捆绑包上下文,我可以务实地加载其他捆绑包。感谢您的回答。
    • @Neil:这可能是错误的上下文 :-) 正如我所说,这是不得已而为之的方法。
    猜你喜欢
    • 2017-11-21
    • 2015-03-06
    • 1970-01-01
    • 2011-07-10
    • 2013-06-22
    • 2012-02-10
    • 2011-03-19
    • 2014-07-04
    相关资源
    最近更新 更多