一、概述
Eclipse的强大功能,广泛支持完全得益于其基于OSGI的插件机制。其所有功能部件都以插件形式
存在,可以轻易地加入或退出系统,用户可以自行加入自己的功能插件来扩展Eclipse的功能,并能快
速地应用于其他用户。这样的机制充分体现了软件的模块化、可重用性,对于软件的开发和扩展、维护
都带来了极大的方便。
这样的插件机制,我们也希望能应用到我们自己的软件产品中,Eclipse的开发团队也意识到了这
一点,在Eclipse 3.0之后,将其基于OSGI的插件机制独立出来,形成了一个称为RCP的运行平台。
通过Eclipse内建的PDE平台,我们可以轻松地开发出我们自己的RCP应用。如果需要扩展软件的功
能,只需要制作相应的插件加入就可以了。
二、RCP应用
下面我们看看一个典型的RCP应用是什么样的?在Eclipse中建立一个名为MyRCP的Plugin项目,选
择Hello RCP模板,然后将项目导出至一个空目录中,生成如下的文件和目录结构:
/eclipse/
configuration/
config.ini
plugins/
MyRCP_1.0.0.jar
org.eclipse.core.commands_3.1.0.jar
org.eclipse.core.expressions_3.1.0.jar
org.eclipse.core.runtime_3.1.1.jar
org.eclipse.help_3.1.0.jar
org.eclipse.jface_3.1.1.jar
org.eclipse.osgi_3.1.1.jar
org.eclipse.swt.win32.win32.x86_3.1.1.jar
org.eclipse.swt_3.1.0.jar
org.eclipse.ui.workbench_3.1.1.jar
org.eclipse.ui_3.1.1.jar
org.eclipse.update.configurator_3.1.0.jar
.eclipseproduct
MyRCP.exe
Startup.jar
以上是一个RCP应用最基本的文件结构。
三、Eclipse源代码编译
从eclipse.org下载源代码,这里以3.1.1为例。将其解压缩到一个空目录中,我们可以看到,所有
的插件的源代码都被放置在plugins目录下,目录名与插件的jar包名相对应。
org.eclipse.core.commands org.eclipse.core.commands_3.1.0.jar
org.eclipse.core.expressions org.eclipse.core.expressions_3.1.0.jar
org.eclipse.core.runtime org.eclipse.core.runtime_3.1.1.jar
org.eclipse.help org.eclipse.help_3.1.0.jar
org.eclipse.jface org.eclipse.jface_3.1.1.jar
org.eclipse.osgi org.eclipse.osgi_3.1.1.jar
org.eclipse.swt.win32.win32.x86 org.eclipse.swt.win32.win32.x86_3.1.1.jar
org.eclipse.swt org.eclipse.swt_3.1.0.jar
org.eclipse.ui.workbench org.eclipse.ui.workbench_3.1.1.jar
org.eclipse.ui org.eclipse.ui_3.1.1.jar
org.eclipse.update.configurator org.eclipse.update.configurator_3.1.0.jar
面对154M大小的源代码,我们该如何下手?
对于较小的源代码项目,我们可以找到程序的执行入口,通常是main函数,然后跟踪程序的运行过程,
分析相应的源代码文件。但对于一个大项目时,我们所要做的第一步是将代码剥离,获得一个最小的可
正常运行的运行体,也就是我们上面所列的RCP的执行体。
剥离源代码的方法一般有两个:
1、从大到小,逐渐缩小
这个方法的优点是最好地保证了程序的完整性,得到的代码总是可编译的。缺点是剥离得不彻
底,有过多的冗余代码。
2、从小到大,逐渐增大
这个方法的优点是剥离彻底,但要确保代码可以正常编译,要做很多次尝试。
如果有代码相关性的分析软件来提取相关文件,这样就可以做到快速有效。
不管是分析linux的源代码,还是分析eclipse,我们首先从编译的批处理文件入手,eclipse使用
的是Ant的build.xml文件。经过对源代码n次的尝试,终于找到了一个非常简便的方法,可以生成我
们所需要的RCP执行体的所有文件。
我们以编译Win32平台为例,我们唯一需要做的是修改名为:assemble.org.eclipse.sdk.win32.win32.
x86.xml的文件,这个文件的主要任务是将编译好的文件打包。我们通过修改让它只将我们所需要的文
件打包,就可以实现我们的要求,且不用对编译脚本代码做任何修改,保证了编译的顺利进行,确保了
我们所得到的执行体的完整性。
<ant antfile="build.xml" dir="plugins/org.eclipse.tomcat" target="gather.bin.parts">
<property name="destination.temp.folder" value="${eclipse.plugins}"/>
</ant>
<ant antfile="build.xml" dir="plugins/org.eclipse.swt.win32.win32.x86" target="gather.bin.parts">
<property name="destination.temp.folder" value="${eclipse.plugins}"/>
</ant>
……
<ant antfile="build.xml" dir="features/org.eclipse.sdk/" target="gather.bin.parts">
<property name="feature.base" value="${eclipse.base}"/>
</ant>
这些代码,是将编译好的文件复制到tmp目录,以便接下来将其打包成jar文件。根据dir参数来找
到上面所列的11个插件所对应的代码。
<ant antfile="build.xml" dir="features/org.eclipse.rcp/" target="gather.bin.parts">
<property name="feature.base" value="${eclipse.base}"/>
</ant>
并保留上面一段代码。其余用<!-- -->注释掉。
<antcall target="jarUp">
<param name="source" value="${eclipse.plugins}"/>
<param name="elementName" value="org.eclipse.swt.win32.win32.x86_3.1.1"/>
</antcall>
<antcall target="jarUp">
<param name="source" value="${eclipse.plugins}"/>
<param name="elementName" value="org.eclipse.ui_3.1.1"/>
</antcall>
……
<antcall target="jarUp">
<param name="source" value="${eclipse.plugins}"/>
<param name="elementName" value="org.eclipse.ui.cheatsheets_3.1.1"/>
</antcall>
这些代码是将提取出来的文件打包成jar文件。同样根据value的值来找到相对应的代码,这里只保
留RCP里对应的11个插件的代码,其余都注释掉。
<exec executable="zip" dir="${assemblyTempDir}">
<arg line="-r -q ${zipargs} '${archiveFullPath}'"/>
<arg line="${pluginArchivePrefix}/org.eclipse.swt.win32.win32.x86_3.1.1.jar"/>
<arg line="${pluginArchivePrefix}/org.eclipse.help.appserver_3.1.0.jar"/>
<arg line="${pluginArchivePrefix}/org.eclipse.ant.ui_3.1.1.jar"/>
<arg line="${pluginArchivePrefix}/org.eclipse.pde.runtime_3.1.1.jar"/>
<arg line="${pluginArchivePrefix}/org.eclipse.ui_3.1.1.jar"/>
<arg line="${pluginArchivePrefix}/org.eclipse.jdt.source_3.1.1"/>
<arg line="${pluginArchivePrefix}/org.eclipse.debug.ui_3.1.1.jar"/>
……
<arg line="${pluginArchivePrefix}/org.eclipse.osgi_3.1.1.jar"/>
<arg line="${pluginArchivePrefix}/org.eclipse.core.boot_3.1.0.jar"/>
<arg line="${pluginArchivePrefix}/org.eclipse.pde.ui_3.1.1.jar"/>
</exec>
这些代码是将打包好的jar文件,压缩到result目录下的一个zip文件中,生成一个完整的执行体。
我们根据line参数找到相应11个插件的代码行,其余行都注释掉。保留最后一条:
<exec executable="zip" dir="${eclipse.base}/win32.win32.x86">
<arg line="-r -q ${zipargs} '${archiveFullPath}' . "/>
</exec>
经过这样的修改,我们就可以得到一个最简单的RCP执行体了。现在,我们在命令行下执行:
cd src
build –target run
我们这里使用的方法是第一种方法,并没有对代码做任何改动。执行编译会耗费较多的时间。经过
片刻的等待,编译的结果是:在result目录下产生一个名为:org.eclipse.sdk-M20050929-0840-win32
.win32.x86.zip的压缩文件。
四、RCP运行
将上边编译好的zip文件解压缩,再将编译好的MyRCP_1.0.0.jar复制到plugins目录下,并修改configu
ration目录下的config.ini文件:
osgi.splashPath=platform:/base/plugins/MyRCP
eclipse.product=MyRCP.MyRCP
osgi.bundles=org.eclipse.core.runtime@2:start,org.eclipse.update.configurator@3:start
osgi.bundles.defaultStartLevel=4
然后点击MyRCP.exe执行。如果一切顺利,将出现一个RCP的空白窗体,至此一个完整的RCP程序从Eclip
se的源代码里编译完成了。