【问题标题】:Using the OSGi API, how do I find out if a given bundle is a fragment?使用 OSGi API,我如何确定给定的捆绑包是否是片段?
【发布时间】:2012-07-24 05:06:52
【问题描述】:

在 OSGi API 中,对 BundleContext.getBundles() 的调用会返回所有包,无论它们是否是片段。对于给定的Bundle 对象,判断这是否是片段的最佳方法是什么?

【问题讨论】:

    标签: osgi bundle osgi-fragment


    【解决方案1】:

    一种可能的方法:使用Bundle.getHeaders() 查找Fragment-Host 标头。如果它存在,它就是一个片段。

    【讨论】:

    • 现在用我所知道的最好的方式回答我自己的问题......如果这是错误的或者有更好的方法,我将在别处奖励答案!
    【解决方案2】:

    最好的方法:

    (bundle.adapt(BundleRevision.class).getTypes() & BundleRevision.TYPE_FRAGMENT) != 0

    【讨论】:

    • 是的,这比我的方式更明确。谢谢!
    • 请注意,这是 OSGi 4.3 中的新 API。另请注意,如果您在卸载捆绑包时失去竞争条件,adapter() 可能会返回 null。
    【解决方案3】:

    根据 OSGi 核心规范第 4 版 4.2 版,还有PackageAdmin 服务,它提供对捆绑包结构信息的访问,例如确定给定的捆绑包是否是片段。

    import org.osgi.framework.Bundle;
    import org.osgi.service.packageadmin.PackageAdmin;
    
    PackageAdmin packageAdmin = ...; // I assume you know this
    
    Bundle hostBundle = ...;         // I assume you know this
    Bundle fragmentBundle = ...;     // I assume you know this
    
    assertFalse(PackageAdmin.BUNDLE_TYPE_FRAGMENT, packageAdmin.getBundleType(hostBundle);
    assertEquals(PackageAdmin.BUNDLE_TYPE_FRAGMENT, packageAdmin.getBundleType(fragmentBundle);
    

    显然,在 OSGi 4.3 中,PackageAdmin 服务似乎是 deprecated,应该被 org.osgi.framework.wiring 包替换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-19
      • 2015-02-06
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多