如何在eclipse RCP中找到孤儿插件?

时间:2009-07-29 13:19:31

标签: eclipse eclipse-rcp update-site

使用RCP更新站点禁止孤立插件,否则插件不在功能中。 如果未填充此条件,则更新管理器将返回以下错误: 生成的配置不包含平台。

不幸的是,无法确定哪些插件是孤儿。 如何找到孤儿插件?

1 个答案:

答案 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());
        }
    }            
}