【问题标题】:How to find orphan plugins in eclipse RCPs?如何在 Eclipse RCP 中找到孤立插件?
【发布时间】:2010-11-15 01:43:58
【问题描述】:

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

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

【问题讨论】:

    标签: eclipse eclipse-rcp update-site


    【解决方案1】:

    这是一个起点(这适用于 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());
            }
        }            
    }
    

    【讨论】:

    • 不客气,但令人讨厌的是这不是标准对话框的一部分。从那以后,我看了一下,AboutFeaturesPage 的代码与第一部分几乎完全相同(只是用一些 Info 对象将其包装起来)。向该页面添加“显示孤儿”按钮将是微不足道的。
    猜你喜欢
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2015-01-31
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多