2

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

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

4

1 回答 1

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 moment) 发现问题。确保在所有工作区和已启用的目标插件已启用的情况下运行目标工作区,否则显然会扭曲您的结果。如果您安装插件并稍微修饰一下,您将不会遇到此问题。

//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());
        }
    }            
}
于 2009-07-29T15:33:22.357 回答