【发布时间】:2012-07-24 05:06:52
【问题描述】:
在 OSGi API 中,对 BundleContext.getBundles() 的调用会返回所有包,无论它们是否是片段。对于给定的Bundle 对象,判断这是否是片段的最佳方法是什么?
【问题讨论】:
标签: osgi bundle osgi-fragment
在 OSGi API 中,对 BundleContext.getBundles() 的调用会返回所有包,无论它们是否是片段。对于给定的Bundle 对象,判断这是否是片段的最佳方法是什么?
【问题讨论】:
标签: osgi bundle osgi-fragment
一种可能的方法:使用Bundle.getHeaders() 查找Fragment-Host 标头。如果它存在,它就是一个片段。
【讨论】:
最好的方法:
(bundle.adapt(BundleRevision.class).getTypes() & BundleRevision.TYPE_FRAGMENT) != 0
【讨论】:
根据 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 包替换。
【讨论】: