现在的位置: 首页 > 综合 > 正文

从Eclipse源代码中编译生成RCP执行体

2013年03月04日 ⁄ 综合 ⁄ 共 5664字 ⁄ 字号 评论关闭

一、概述
    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

四、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的源代码里编译完成了。

抱歉!评论已关闭.