如何获取Eclipse已经加载的插件

背景:

在Eclipse插件开发,自动化构建产品的过程中,当产品构建好之后,如何得知所build的插件都是build的成功且是被成功加载的。点击 Eclipse的/About Eclipse/Install Details/Plug-ins 然后能在这个页面所成功加载的插件.

 

 

 

但是要是开发规模仅是几个插件还是肉眼能区分的,如果插件个数很多就难弄了。遗憾的是这个页面不能导出 不能复制。只能肉眼看。当你开发的产品涉及自己开发的插件有上几百个的时候,就比较麻烦了。

 

解决办法

修改其源码,将这些插件名字写进文件。

如何修改

经搜索发现这个About页面是在org.eclipse.ui.workbench插件中实现的

找到相应的java类,做适当修改,重新编译,替换jar包中的class,以clean方式启,便能实现。

我们开发的产品对应 Eclipse 3.5.2

对应其源码在http://archive.eclipse.org/eclipse/downloads/drops/R-3.5.2-201002111343/eclipse-SDK-3.5.2-win32.zip

org.eclipse.ui.workbench插件 版本是 org.eclipse.ui.workbench_3.5.2.M20100113-0800.jar

其对应的源码包是org.eclipse.ui.workbench.source_3.5.2.M20100113-0800.jar

解压这个源码包导入进Eclipse

将org.eclipse.ui.workbench_3.5.2.M20100113-0800.jar中的plugin.xml文件放至工程中,将META-INF\MANIFEST.MF这个文件替换工程中相应文件

这样这个工程依赖其他插件的配置就ok了。如下图:

 

找到org.eclipse.ui.internal.about.AboutPluginsPage这个类

在 createControl(Composite parent) 方法中略作修改

将bundleInfos中获得的插件名称写入至log文件

修改如下

 

 

public void createControl(Composite parent) {
         initializeDialogUnits(parent);
 
         // create a data object for each bundle, remove duplicates, and include
         // only resolved bundles (bug 65548)
         Map map = new HashMap();
         for (int i = 0; i < bundles.length; ++i) {
             AboutBundleData data = new AboutBundleData(bundles[i]);
             if (BundleUtility.isReady(data.getState())
                     && !map.containsKey(data.getVersionedId())) {
                 map.put(data.getVersionedId(), data);
             }
         }
         bundleInfos = (AboutBundleData[]) map.values().toArray(
                 new AboutBundleData[0]);
         
         /**
          * 将Eclipse已经加载所有插件名称排序后写入log文件
          * 以方便ci集成后check
          */
         List<String> allPluginsName = new ArrayList<String>(bundleInfos.length);
         for(AboutBundleData aboutBundleInfo : bundleInfos) {
             allPluginsName.add(aboutBundleInfo.getBundle().getSymbolicName());
         }
         Collections.sort(allPluginsName);
         
         StringBuilder sb = new StringBuilder();
         for(String tempPluginName : allPluginsName) {
             sb.append(tempPluginName);
             sb.append("\n");
         }
         String eclipseInsPath = Platform.getInstallLocation().getURL().getPath();
         String allPluginsNameLogFilePath = eclipseInsPath + "/allPlugins.log";
         File allPluginsNameLogFile = new File(allPluginsNameLogFilePath);
         try {
             if(allPluginsNameLogFile.exists()) {
                 allPluginsNameLogFile.delete();
             }
             Writer fWriter = new FileWriter(allPluginsNameLogFile);
             BufferedWriter bfWriter = new BufferedWriter(fWriter);
             bfWriter.write(sb.toString());
             bfWriter.flush();
             bfWriter.close();
             fWriter.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
         
         
         WorkbenchPlugin.class.getSigners();
 
         sashForm = new SashForm(parent, SWT.HORIZONTAL | SWT.SMOOTH);
         FillLayout layout = new FillLayout();
         sashForm.setLayout(layout);
         layout.marginHeight = 0;
         layout.marginWidth = 0;
         GridData data = new GridData(GridData.FILL_BOTH);
         sashForm.setLayoutData(data);
 
         Composite outer = createOuterComposite(sashForm);
         PlatformUI.getWorkbench().getHelpSystem().setHelp(outer, helpContextId);
 
         if (message != null) {
             Label label = new Label(outer, SWT.NONE);
             label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
             label.setFont(parent.getFont());
             label.setText(message);
         }
 
         createTable(outer);
         setControl(outer);
     }
 

 

 

代码修改好后,clean 工程使其重新编译,到bin\org\eclipse\ui\internal\about 找到AboutPluginsPage几个class(含其内部类编译出来的class)

关闭eclipse

替换掉org.eclipse.ui.workbench_3.5.2.M20100113-0800.jar包中相应的class文件(附件中是改好的)

eclipse -clean 方式启动eclipse 即可。

 

--EOF--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值