在OSGi API中,对BundleContext.getBundles()的调用将返回所有包,无论它们是否为片段。对于给定的Bundle对象,判断这是否为片段的最佳方法是什么?
答案 0 :(得分:9)
最佳方式:
(bundle.adapt(BundleRevision.class).getTypes() & BundleRevision.TYPE_FRAGMENT) != 0
答案 1 :(得分:4)
一种可能的方法:使用Bundle.getHeaders()查找Fragment-Host标头。如果它存在,它就是一个片段。
答案 2 :(得分:1)
根据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
包替换。