最近研究了一下Eclipse的启动过程,查了点资料,也有点收获。下面是搜集到的一个比较好的说明,共享下。。。

在Eclipse启动过程中,Eclipse.exe负责启动,也就是把startup.jar运行起来,用java –jar startup.jar是差不多的效果。

startup.jar里只有2个类,一个是Main.java,一个是WebStartMain.java,所不同的是后者是用于java web start的启动类。

Main.java的任务比较简单,主要是处理System.GetProperties()和args,从这些参数里也可以看出eclipse的定制性非常强,另一方面处理了一下启动界面(默认一启动所看到的图像,其实也可以用参数把它隐掉),它最主要的核心任务是查找到org.eclipse.osgi_3.2.1*.jar,并把它load进来后通过java的反射机制把org.eclipse.core.runtime.adaptor.EclipseStarter类运行起来。

接下来要说的就是EclipseStarter类的运行情况了,它位于OSGI的那个plugin中。对OSGI,要学习Eclipse一定要学习OSGI(可以从www.osgi.org查找到相关的资料)。简单来说OSGI本来是用于设备上软件的一个开发框架,在eclipse3.1中被用来作为系统的模块化框架,eclipse有个专门的项目equinox专门用来实现osgi框架,也被成为systembundle,而所有其它的作为一个bundle被systembundle来管理。

EclipseStarter的作用就把osgi的启动类,它是通过configuration目录下的config.ini来进行配置的。它的第一步主要实例化了org.eclipse.osgi.baseadaptor.BaseAdaptor和org.eclipse.osgi.framework.internal.core.OSGi并启动,你们会看到configuration生成org.eclipse.osgi目录放置相关的bundle信息,在eclipse启动的-clean参数也就是清理这个目录。Osgi所做的工作是把equinox、runtime、update等基本的bundle定位、加载进来。

EclipseStarter一切就绪后就要启动ide了,它是通过org.eclipse.core.runtime.internal.adaptor. EclipseStarter启动起来的。说道这里又要说osgi,实际上这里不是直接、也不是reflection启动的,而是不同osgi的ServiceRigistry获得后实例化后启动的(也就是在上一步load runtime bundle的时候注册上的服务)。

下一步就要转战org.eclipse.core.internal.runtime.PlatformActivator了,它的作用要说也简单,把所有注册过的applications级的IExtension启动起来,这里就又主要转到org.eclipse.ui.ide_3.2.1.M20060915-1030.jar中的org.eclipse.ui.internal.ide. IDEApplication,一直到这里从开始启动我们的ide。

从以上过程也可以看出,eclipse就是通过启动类把osgi框架启动起来作为内核也就是systembundle,再进行其它bundle的加载,和jboss通过启动类启动jmx微内核再加载各种MBean的机制是类似的,这也就导致如果对eclipse整体没有一个很好的了解,学习梯度还是比较大的,经常看着看着只见树木不见森林了。

Eclipse启动分析的更多相关文章

  1. Eclipse启动分析。。

    最近研究了一下Eclipse的启动过程,查了点资料,也有点收获.下面是搜集到的一个比较好的说明,共享下... 在Eclipse启动过程中,Eclipse.exe负责启动,也就是把startup.jar ...

  2. 增加eclipse启动的Tomcat内存的

    JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序.这个初始内存和最大内存在一定程度都会影响程序的性能. 如何设置Tomcat的JVM内存大小 Tomcat本身不能直接在计算机上运行 ...

  3. eclipse启动问题

    今天在公司正上班,突然跳出来一个windows update补丁更新,然后就确认呗,结果更新完成之后, eclipse打不开了,启动报错: could not find the main class, ...

  4. tomcat出现的PermGen Space问题(bat,或者eclipse启动。)

    参考地址 http://www.blogjava.net/allen-zhe/archive/2007/12/18/168556.html 参考地址:http://javavsxiaoming.ite ...

  5. 【问题解决:启动卡死】Eclipse启动卡死的解决办法

    问题描述 Eclipse启动后卡死 问题分析 由于上一次没有正确关闭,导致在启动的时候开始 问题解决 方法1(推荐): 到<workspace>\.metadata\.plugins\or ...

  6. Eclipse源代码分析

    Eclipse源代码分析 一.概述走入Eclipse的内核,看看它到底是怎么工作的? 1.Eclipse源代码 下载地址:http://download.eclipse.org/eclipse/dow ...

  7. 通过eclipse启动tomcat设置JAVA_OPTS失败的解决方案

    clipse中配置tomcat方法: Window-->Preference-->Server-->Runtime Environment-->add-->Apache ...

  8. JVM参数调优:Eclipse启动实践

    本文主要参考自<深入理解 Java 虚拟机>.这本书是国人写的难得的不是照搬代码注释的且不是废话连篇的技术书,内容涵盖了 Java 从源码到字节码到执行的整个过程,包括了 JVM(Java ...

  9. IDEA和Eclipse启动优化

    昨天对比了下IDEA和Eclipse的启动速度,发现IDEA启动真的是好慢啊!!! 电脑配置:8G win7 IDEA启动配置 -Xms1024m -Xmx1024m -Xmn500m -XX:Met ...

随机推荐

  1. crontab定时任务配置记录

    一.前言 今天简单记录下crontab的配置 二.crontab目录 /etc/crontab 文件 这是系统运行的调度任务 /var/spool/cron 目录 用户自定义的crontab任务放在此 ...

  2. JavaScript中for..in循环陷阱介绍

    for...in循环中的循环计数器是字符串,而不是数字它包含当前属性的名称或当前数组元素的索引,下面有个不错的示例大家可以参考下   大家都知道在JavaScript中提供了两种方式迭代对象: (1) ...

  3. C#自定义控件

    在网络上看了许多文章,终于找到了让我入门的自定义控件文章,这是链接  https://msdn.microsoft.com/zh-cn/library/cc438236(v=vs.71).aspx   ...

  4. paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较

    paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较 ##java ----------- 在JDK1.7中,摒弃了Java集合接口的实现类,如:Ar ...

  5. paip.spring3 mvc servlet的配置以及使用最佳实践

    paip.spring3 mvc servlet的配置以及使用最佳实践 1. Web.xml 1 2. springMVC.xml 2 1. mvcAction .mvcAction 2 2. Res ...

  6. paip.陕北方言 广东方言的不同单字 1千高频字

    paip.陕北方言 广东方言的不同单字 1千高频字  SELECT * FROM `canx` c where c.cn in (  select zi from hezi1k h)  and st ...

  7. PHP Official Service

    The way to startup official service command: php.exe -S localhost:80

  8. 通过sqlplus导出数据到csv

    例子 [oracle@localhost ~]$ cat data.sqlset echo offset feedback offset linesize 100set pagesize 0set s ...

  9. Entity Framework Code First迁移基本面拾遗

    项目中用到了EF Code First和迁移,但发现有些方面似懂非懂.比如:如何在迁移文件中控制迁移过程?如果在迁移文件中执行SQL语句?如何使用Update-Database的其它参数?数据库在生产 ...

  10. easy datagrid 按钮控制

    onBeforeLoad : function() {// 这里是紧接着你的修改按钮的 // 注意ID为你初始化工具栏按钮对应的ID var adminid=<%=Admin_Id%>+' ...