【发布时间】:2010-11-15 01:43:58
【问题描述】:
使用 RCP 更新站点禁止孤儿插件,否则插件不在功能中。 如果不满足此条件,更新管理器将返回以下错误: 生成的配置不包含平台。
不幸的是,无法确定哪些插件是孤立的。 如何找到孤儿插件?
【问题讨论】:
标签: eclipse eclipse-rcp update-site
使用 RCP 更新站点禁止孤儿插件,否则插件不在功能中。 如果不满足此条件,更新管理器将返回以下错误: 生成的配置不包含平台。
不幸的是,无法确定哪些插件是孤立的。 如何找到孤儿插件?
【问题讨论】:
标签: eclipse eclipse-rcp update-site
这是一个起点(这适用于 Eclipse 3.4 及更高版本,当引入 P2 存储库时,早期版本以不同方式存储其配置。IIRC 您可以在 platform.xml 中看到所有插件和功能)。
使用“Hello World”模板创建一个新的插件项目(New->Other->Plug-in Development->Plug-in Project),然后将此代码放入 SampleAction 的 run 方法中。
将插件作为测试Eclipse应用程序运行并选择Sample Menu->Sample Action,不属于某个功能的插件将输出到父工作区的控制台。当我运行此程序时,比我预期的要多得多,我看了几眼并没有发现逻辑错误。
编辑,发现逻辑错误,在最内层循环中使用了错误的数组索引。不过还是不太对。
编辑 2.(捂脸时刻)发现问题。请务必在所有工作区和启用的目标插件启用的情况下运行目标工作区,否则显然会扭曲您的结果。如果你安装插件并稍微修饰一下你就不会遇到这个问题。
//get all the plugins that belong to features
IBundleGroupProvider[] providers = Platform.getBundleGroupProviders();
Map<Long, IBundleGroup> bundlesMap = new HashMap<Long, IBundleGroup>();
if (providers != null) {
for (int i = 0; i < providers.length; i++) {
IBundleGroup[] bundleGroups = providers[i].getBundleGroups();
System.out.println("Bundle groups:");
for (int j = 0; j < bundleGroups.length; j++) {
Bundle[] bundles = bundleGroups[j] == null ? new Bundle[0] : bundleGroups[j]
.getBundles();
System.out.println(bundleGroups[j].getIdentifier());
for (int k = 0; k < bundles.length; k++) {
bundlesMap.put(bundles[k].getBundleId(), bundleGroups[j]);
}
}
}
}
BundleContext bundleContext = Activator.getDefault().getBundle().getBundleContext();
if(bundleContext instanceof BundleContextImpl) {
Bundle[] bundles = ((BundleContextImpl)bundleContext).getBundles();
System.out.println("Orphan Bundles:");
for (int i = 0; i < bundles.length; i++) {
if(!bundlesMap.containsKey(bundles[i].getBundleId())) {
System.out.println(bundles[i].getSymbolicName());
}
}
}
【讨论】: