gpt4 book ai didi

osgi - 如何在运行时通过 Import-Package 获取我的包所依赖的所有 OSGi 包?

转载 作者:行者123 更新时间:2023-12-01 13:25:44 26 4
gpt4 key购买 nike

我知道我可以(理论上)为我的包获取 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com