为eclipse平台添加代码

  最近由于实验室项目需要接触到equinox weaving,这方面因为没有商业价值或者说用的人比较少,国内还没有什么资料,因此开始走了不少弯路。如果你英文还不错,下面几个链接是必须看的这个是equinox weaving的官方介绍。

  众所周知,eclipse3.0以后的版本都采用了OSGi框架,并且自带了OSGi容器equinox,而equinox支持aspectj(equinox aspect),如果你对这些都不熟悉,那这篇文章不适合您,您可以从基础的OSGi和Aspectj的开始学习。说到这就不得不提实验室最近的项目,这个项目学术性比较强,我们这个项目在sourceforge.net开源了,如果有兴趣可以看一下%20on%20PSC2GS%20with%20Dict%20Example/,如果能给点宝贵的意见那就更加荣幸了。这个项目的最后应用就是将自动生成的aop代码通过equinox aspect添加到基于OSGi框架的系统中。sourceforge上的例子是完全可以实现的,我们的项目到这理论已经付诸实现,接下来需要做的就是需要测试我们的aop代码最原有系统的profromance evaluation。因此,我们选择了大名鼎鼎的同样也是由OSGi框架实现的Eclipse平台来加aop代码然后进行性能分析。

  好了,扯淡到此结束,开始正题。在sourceforge上的Dict例子是一个标准的OSGi例子,对每个相应的bundle建一个aspectj项目添加代码即可。刚开始的时候,我以为只要将eclipse所有的源代码import到workspace之后再如法炮制对需要的插件添加aop即可。后来几番尝试之后我发现,完全不是这样。这里equinox weaving就出现了。equinox aspect和equinox weaving的区别在于:前者是编译时添加aop代码,一个目标类和一个aj文件编译后只产生一个.class文件,对这个class文件反编译你会发现其实.aj文件就是在编译的时候“编织”进了.class文件;而后者属于载入时添加aop代码,编译时编织是在编译时将.aj文件编织入目标bundle,而载入时编织workspace中可以只有一个.aj文件,在指定了target platform(关于target platform请参看?topic=%2Forg.eclipse.pde.doc.user%2Fconcepts%2Ftarget.htm)之后在目标平台载入的时候再进行编译。这些文章的第一个链接已经说的很清楚,这些是我反复研读这些链接的理解,如果有理解上的错误欢迎批评指正。

  上面简单介绍了equinox weaving,想要对eclipse添加aop代码就需要用到equinox weaving,下面来手把手演示如果用eclipse给eclipse加aop代码。

  这里采用的是eclipse juno(4.2)作为开发平台。顺便吐槽一下4.2是真尼玛慢啊。。。

  step1:下载eclipse juno,如果没有的话。

  step2:安装adjt和equinox weaving,这个应该不用教吧,只给出下载链接

  step3:新建一个Plug-in项目MyAspect2

  

  然后将这个插件项目转成AspectJ项目,右击项目->configure->convert to AspectJ,会弹出提示是否要加入必要组件org.aspectj.runtime,选择是。

  

  step4:在MyAspect2项目的src文件夹下新建一个包,myaspect2.aspect,然后再新建一个aspect。

   step5:设置MyAspect2的MANIFEST.MF:1,将myaspect2.aspect包进行export;2,指定aspectj项目的target bundle(通过添加“Eclipse-SupplementBundle: org.eclipse.ui.workbench”到MANIFEST.MF,为什么选择这个目标bundle下面会有讲解)。如下面两张图

  

  

  这里我们要对org.eclipse.ui.workbench插件添加aop代码,这是一个eclipse启动过程中首先会调用的插件之一。观察该插件的源代码,其package org.eclipse.ui下PlatformUI类下有这样一个静态方法,代码如下:

public static IWorkbench getWorkbench() {if (Workbench.getInstance() == null) { IllegalStateException(WorkbenchMessages.PlatformUI_NoWorkbench);}return Workbench.getInstance();}

  很显然,eclipse启动过程中会调用这个静态方法。因此选择该方法作为aop代码的pointcut。

  MyAspect.aj代码如下:这里只是为了演示,因此简单打印Hello eclipse即可。

package myaspect2.aspect;import org.eclipse.ui.IWorkbench;public aspect MyAspect {before() :execution(IWorkbench org.eclipse.ui.PlatformUI.getWorkbench()){System.out.println(“Hello eclipse!”);}}

  与普通的aspectj不同,这里eclipse本身给出了提示“advice defined in myaspect2.aspect.MyAspect has not been applied [Xlint:adviceDidNotMatch]”意识是说这个advice 没有被applied,这是正常的,因为我们要添加aop代码的切点并不在workspace中。

  

  step6:各种保存操作之后,Run->Run Configuration->右击Eclipse Application ->new ->Plug-ins选项卡->Launch with:

选中MyAspect2,然后点击右侧的Add Required Plug-ins。这样Restore Defaluts按钮下方的464out of 467 selected会变成253 out of 467 selected。

  step7:在target platform中找到org.eclipse.equinox.weaving.aspectj,将这个插件的start level设置为2,并设置为auto start。

  

  step8:点击Apply,点击Run。

  

  大功告成!显然,这个静态方法在启动过程中被调用了不止一次!

 同时感谢Eclipse Forum的Andrew Eisenberg在我摸索equinox weaving过程中给予的帮助!

  纯手打,,欢迎转载,但请标明出处,谢谢!

懂得倾听别人的忠告。

为eclipse平台添加代码

相关文章:

你感兴趣的文章:

标签云: