- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道我可以(理论上)为我的包获取 Import-Package
header ,解析它,并检查哪些包导出该包,但这似乎容易出错(而且看起来像甚至可能返回错误的结果)。没有比获取当前包(通过 FrameworkUtil.getBundle(ClassFromMyBundle.class)
)、检查 Import-Package
header (通过调用 Bundle.getHeaders().get("Import-Package")
),并将导入的包与其他包导出的包进行比较(同样通过调用 Bundle.getHeaders().get( "导出包")
)?
最佳答案
不要尝试解析和比较 header 。相反,您可以使用 bundle 的 BundleWiring
来获取 bundle 所需的线路(具体基于所需的包)。 然后您可以获得提供这些线路的 bundle ,以通过 Import-Package
获取您的 bundle 所依赖的所有 bundle 的列表。
BundleWiring.getRequiredWires
(
BundleRevision.PACKAGE_NAMESPACE
)
将返回所有必需的 BundleWire
将包提供给 bundle 的 s。然后你可以调用BundleWire.getProvider()
在每个 BundleWire
上获取提供一个或多个这些包的包。但是,getRequiredWires(BundleRevision.PACKAGE_NAMESPACE)
不会区分通过 Import-Package
header 和 DynamicImport-Package
header 导入的包。由于您只想查找 Import-Package
依赖项,因此您需要检查 BundleWire
是否为动态依赖项。您可以通过检查 BundleRequirement
的指令来执行此操作:
BundleRequirement requirement = bundleWire.getRequirement();
if (requirement != null) {
Map<String, String> directives = requirement.getDirectives();
String resolution = directives.get("resolution");
if ("dynamic".equalsIgnoreCase(resolution)) {
// The dependency was obtained via DynamicImport-Package.
}
}
这是一个可以为您完成上述所有操作的方法:
public static Set<Bundle> getBundlePackageImportDependencies(Bundle bundle) {
BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
if (bundleWiring == null) {
return Collections.emptySet();
}
List<BundleWire> bundleWires =
bundleWiring.getRequiredWires(BundleRevision.PACKAGE_NAMESPACE);
if (bundleWires == null) {
return Collections.emptySet();
}
Set<Bundle> bundleDependencies = new HashSet<Bundle>();
for (BundleWire bundleWire : bundleWires) {
BundleRevision provider = bundleWire.getProvider();
if (provider == null) {
continue;
}
Bundle providerBundle = provider.getBundle();
BundleRequirement requirement = bundleWire.getRequirement();
if (requirement != null) {
Map<String, String> directives = requirement.getDirectives();
String resolution = directives.get("resolution");
if ("dynamic".equalsIgnoreCase(resolution)) {
continue;
}
}
bundleDependencies.add(providerBundle);
}
return Collections.unmodifiableSet(bundleDependencies);
}
此方法可用于获取当前包的依赖项,如下所示:
getBundlePackageImportDependencies(
FrameworkUtil.getBundle(ClassFromYourBundle.class))
关于osgi - 如何在运行时通过 Import-Package 获取我的包所依赖的所有 OSGi 包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48345301/
我是一名优秀的程序员,十分优秀!