摘自:http://blog.csdn.net/dingdong250/article/details/4951741
使用Eclipse调试Eclipse源码
近期拜读eclipse的源码,第一件事,当然是把源代码搞下来,放到IDE中,debug一番。然后当爽的晕头转向的时候,估计很多东西,就混的脸熟了。有句话,叫“蹬鼻子上脸”,这不也就是说,混脸熟很重要嘛。(ps:总感觉这句话不怎么恰当,嘿嘿。)
第一件事,搞IDE,搞Source。
版本选择原因,由于网上的一番搜索,有若干篇文章,是用于eclipse3.1.1来作为讲解的内容的,不要跟已有的资源过不去,等吸收了之后,再考虑最新版本。
个人看法,从旧一些版本向新版本转换时,变动属于能承受范围,可是如果拿着版本不相符的东东去对比学习已有资源,只能越看越崩溃,然而本片主要讲怎么用eclipse调试eclipse源码,跟版本也几乎没啥联系,所以各位仁兄,版本自己看着合适的选取好了,再说下去,越说越跑题。
下载
JDK:
去sun主页,自己寻找,应该jdk1.5以上都可以。--http://www.sun.com.
Eclipse3.1.1:
http://archive.eclipse.org/eclipse/downloads/drops/R-3.1.1-200509290840/index.php
Eclipse3.5.1:
http://download.eclipse.org/eclipse/downloads/drops/R-3.5.1-200909170800/index.php
(ps:附一个新的IDE,因为eclipse3.5.1,有些地方进行了改动,偶还得重新学过,5555)
都下载齐全了,那么我们接下来,只以eclipse3.1.1为标准来讨论了。
运行eclipse3.1.1 SDK,用做IDE.
把eclipse-sourceBuild-srcIncluded-3.1.1.zip解压缩,同时把其中的....../plugins,作为IDE的wokespace,进行设定。
(ps:如果把父目录,作为workspace,eclipse3.1.1会报一个overlap的错误,而eclipse3.5.1则没有这回事,还是新东东好。)
方法一:
设定之后,开始源码设定,其实这里有一个很懒的方法,同时也很烂。
懒,是因为,这样设定一个目录,就可以调试。
烂,是因为,如果没有将源码逐个导入,则无法进行breakpoint设定,watch等。虽然可以F5,F6,但是总感觉很不爽。
懒烂方法,如下
Windows->Reference,
Plugin-in Development->Target Platform,
选择Source Code Loaction
直接在additional source code locations中添加一个刚才解压缩目录就可以了。(如图)
然后
Imports...,Existing Projects into Workspace,Brows,
来到我们加压后的....../plugins,选中其中子目录org.eclipse.platform,
即可调试运行了。
方法二:
还是好好勤劳一点,鼓捣出一个方便易懂,易使用的好方法吧,嘿嘿。
这个方法,能调试,能设断点,能watch,能代码定义跳转,好处不多说了。
好方法,如下
1.导入解压后的两个项目,只以两个项目为例,因为第一个项目,是启动项目,需要它来启动,然后才能进入其他的调试。
第二个,是因为,该项目为eclipse的核心部分,OSGi的实现,同时兼顾着其他的项目如何导入,如何避免冲突的示范作用。
开始吧,
Imports...,Existing Projects into Workspace,Brows,
来到我们加压后的....../plugins,选中其中子目录org.eclipse.platform,
Imports...,Existing Projects into Workspace,Brows,
来到我们加压后的....../plugins,选中其中子目录org.eclipse.osgi,
两个项目导入后,无法编译,会提示5个error,是来自于osgi的,其实,是缺少4个jar文件,好吧,搞定它。
四个jar地址
collx.jar:
http://dev.eclipse.org/viewsvn/index.cgi/equinox-incubator/org.eclipse.osgi/osgi/collx.jar?view=log&sortby=rev&pathrev=dynamic
ee.minimum.jar:
http://dev.eclipse.org/viewsvn/index.cgi/equinox-incubator/org.eclipse.osgi/osgi/ee.minimum.jar?view=log&sortby=rev&pathrev=v20041201
exceptions.jar:
http://dev.eclipse.org/viewsvn/index.cgi/equinox-incubator/org.eclipse.osgi/osgi/exceptions.jar?view=log&pathrev=v20041027
xmlParserAPIs.jar:
http://dev.eclipse.org/viewsvn/index.cgi/org.apache.xerces/xmlParserAPIs.jar?view=log
下载后,放到org.eclipse.osgi的/osgi问加价下,即可。或者,参看project 属性,Java Build Path,Library。
放好后,直接将org.eclipse.osgi项目,refresh刷新即可。错误就没有了。
启动设定,
对项目org.eclipse.platform,右键,Debug As->Debug...(如下图)
设定插件的选取原则:为了第一次能够顺利debug,最好跟我一样的设定就好了。
至于Workspace Plugin-in,还是External Plug-ins,以后根据自己需要进行适当选取。
我的选择是Workspace Plugin-in只选择了org.eclipse.platform
相应的External Plug-ins仅仅去掉了org.eclipse.platform
(ps:为了调试时候能够负担轻,或许其中的取舍,也有不少利弊呢,可是这不属于此文探讨范围了。)
这样,就不存在插件冲突了。
然后设定源码,如图
Source选项,Add,然后选择Java Project,选择我们的org.eclipse.osgi项目,点击ok就可以了。
设定完毕之后,记得点apply哦。不然,嘿嘿,从来吧就得。
那么,我们去org.eclipse.platform的org.eclipse.core.launcher.Main中,
在public static void main(String[] args) {......}中,设置一个断点,然后开始debug吧。
嘿嘿,成功了呢。
额外补充一:
1.org.eclipse.platform项目
org.eclipse.core.launcher.Main类
main(......);方法 调用了run(......);方法
run(......);方法 调用了basicRun(......);方法
basicRun(......);方法 调用了invokeFramework(......);方法
invokeFramework(......);方法 调用了org.eclipse.core.runtime.adaptor.EclipseStarter类的run(......)方法。
2.org.eclipse.osgi项目
org.eclipse.core.runtime.adaptor.EclipseStarter类
run(......);方法 调用了startup(......);方法
startup(......);调用了org.eclipse.osgi.framework.internal.core.OSGi的构造函数
org.eclipse.osgi.framework.internal.core.OSGi类
OSGi的构造方法 调用了createFramework(......);方法
createFramework(......);方法 调用了org.eclipse.osgi.framework.internal.core.Framework的构造方法。
至此,OSGi和Framework,顺利走过。
其他的地方调试步骤,不再多说,如有其它项目添加,如上即可。
额外补充二:
由于eclipse3系列开始,采用哦OSGi机制,具体eclipse源码分析,和osgi应用,可以参照网上若干文章。
如
分析Eclipse源代码,理解OSGI插件机制内幕:
http://blog.csdn.net/s00n/archive/2006/04/05/652150.aspx
OSGi规范:
http://blog.csdn.net/s00n/archive/2006/04/05/652157.aspx
Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture)
http://blog.csdn.net/s00n/archive/2006/04/05/652163.aspx
等。已经超出本文范围,此文到此结束。
注:
此文绝对菜鸟级文章,菜鸟绝对能对,至于有人如果说看不懂,估计应该还是一枚卵,还是先孵化完毕,再说吧。
此文为个人总结,如有觉得不妥之处,还望高手不吝指教,有则改之,无则加勉。
权益声明如下图。