【问题标题】:How to do the Rewiring Framework after OSGi bundle updateOSGi 包更新后如何进行重新布线框架
【发布时间】:2014-06-15 04:04:29
【问题描述】:

我有一个基于 Equinox 的应用程序。我需要更新一个包并重新连接对应于更新包的 OSGi 包。

我更新了捆绑包,

bundle.update(new FileInputStream(new File(filePath)));

我需要刷新受影响的捆绑包才能影响更新。

我该怎么做?...

【问题讨论】:

    标签: java osgi equinox osgi-bundle


    【解决方案1】:
    BundleContext bcx = bundle.getBundleContext();
    Bundle systemBundle = bcx.getBundle(0);
    
    bundle.update(new FileInputStream(new File(filePath)));
    
    FrameworkWiring frameworkWiring = systemBundle.adapt(FrameworkWiring.class);
    frameworkWiring.refreshBundles(null);
    

    请注意,refreshBundles 是一个异步函数调用。因此,如果您想在刷新 bundle 时捕获事件,您必须传递一个 FrameworkListener 作为第二个参数。

    【讨论】:

    • AFAIK 这会刷新所有捆绑包对吗?..我们不能只刷新受影响的捆绑包吗??..
    • 是的,您可以,请参阅:osgi.org/javadoc/r4v43/core/org/osgi/framework/wiring/…, org.osgi.framework.FrameworkListener...)
    • 检查 FrameworkWiring.refreshBundles(...) 函数的 javadoc。该算法在那里得到了很好的说明。简而言之:只有那些必须刷新的包被刷新(但所有这些包都是可传递的)。
    • 我想它可以使用 getDependencyClosure() 来实现。然后只刷新那些包。对吧?...当有动态导入时,它有什么影响?。
    • 我不知道,在刷新的情况下动态导入的行为如何。通常,我不仅尽量避免使用 Dynamic-Import,而且还尽量避免使用任何具有 Dynamic-Import 的技术。我更喜欢使用 refreshBundles(null)。我不尝试找出应该刷新的内容,因为我不希望最后有一个部分刷新的框架。如果一个包在停止事件中以编程方式卸载另一个包怎么办?如果我不知道,我可能不会刷新使用以编程方式卸载的捆绑包的捆绑包。
    猜你喜欢
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2013-07-08
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多