使用RCP更新站点禁止孤立插件,否则插件不在功能中。 如果未填充此条件,则更新管理器将返回以下错误: 生成的配置不包含平台。
不幸的是,无法确定哪些插件是孤儿。 如何找到孤儿插件?
答案 0 :(得分:4)
这是一个起点(这适用于Eclipse 3.4及更高版本,当引入P2存储库时,早期版本以不同方式存储它们的配置.IIRC您可以看到platform.xml中的所有插件和功能)。
使用“Hello World”模板创建一个新的插件项目(New-> Other-> Plug-in Development-> Plug-in Project),然后将此代码放入SampleAction的run方法中。
将插件作为测试Eclipse Application运行并选择Sample Menu-> Sample Action,不属于某个功能的插件将输出到父工作区的控制台。当我运行这个时,比我预期的要多得多,我已经看了一些,但无法发现逻辑错误。
编辑,发现逻辑错误,使用了最内层循环中使用的错误数组索引。但仍然不太正确。
编辑2.(Facepalm时刻)发现问题。确保使用所有工作区运行目标工作区并启用目标插件,否则它会使结果偏斜。如果您安装插件并将其装扮一点,您将不会遇到此问题。
//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());
}
}
}