Eclipse 启动分析

来源:互联网 发布:淘宝宝贝标题如何优化 编辑:程序博客网 时间:2024/05/22 21:18

[本文主要来自eclipse 3.3 的帮助文档,其中带[]个人的分析和注解] 更新Eclipse 3.6[2010.12.16]

启动过程:

Eclipse本地启动者分两个部分:

     1 eclipse.exe 

     2 一个共享库(eclipse_1017.dll) eclipse_1017.dll 在plugin 目录下以插件的fragment 形式出现org.eclipse.equinox.launcher.[config]。
     为什么要这样设计呢?因为这样可以通过eclipse update 更新eclipse_1017.dll,并且在使用java 直接启动eclipse 时,可以用java 调用JNI 来访问eclipse_1017.dll 以打开splash screen.


启动者插件(The launcher bundle):
  老版本的eclipse 在安装目录中有一个 startup.jar jar 文件。在 eclipse 3.3 中,这个文件被放到插件org.eclipse.equinox.launcher 中。eclispse 依然可以用这个java

jar 文件来直接启动:java -jar plugins/org.eclipse.equinox.launcher_版本号.jar。

 

[注:本人在Mac OS X 上测试,eclipse 不能启动。Windows XP 可以。这样启动还是有问题的,如eclipse 不能重新启动(File-->restart)。]

[大体的启动过程是这样的:由Eclipse 本地启动者(即eclipse.exe 调用eclipse.dll)调用启动者插件。所以下面把eclipse 启动分为三步。]

 


启动eclipse 主要包括3 部分: (即 Eclipse 本地启动者调用 launcher.jar)

    1 一个本地的可执行文件,在windows 系统中为eclipse.exe 文件(对应的eclipse 工程为org.eclipse.equinox.executable.)
    2 一个平台相关的fragment 启动者 (对应的eclipse 工程为org.eclipse.equinox.executable.)

       (CVS:pserver:anonymous@dev.eclipse.org:/cvsroot/rt

            org.eclipse.equinox/framework/bundles/org.eclipse.equinox.executable)
    3 一个launcher.jar jar 文件 (对应的eclipse 工程为org.eclipse.equinox.launcher.)

       (CVS:pserver:anonymous@dev.eclipse.org:/cvsroot/rt

             org.eclipse.equinox/framework/bundles/org.eclipse.equinox.launcher )
  其中这个fragment,必须以文件夹的形式出现在plugin 目录下,以为只有这样,eclipse.exe 才能加载它。
  目录结构如下:
      eclipse/  eclipse.exe 
                plugins/  
                     org.eclipse.equinox.launcher_1.0.0.v20070606.jar 
                     org.eclipse.equinox.launcher.win32.win32.x86_1.0.0.v20070523/   
                             eclipse_1017a.dll
  注意:不同版本的eclispe, 对应的上述的版本号有变化

 

 

[下面解决本地代码(C 代码)调用jvm 来启动org.eclipse.equinox.launcher。有两种方式:1 在一个新的进程中来启动vm(这是通过调用java.exe/javaw.exe来实现的),另一种是通过invocation api 在同一个进程中加载java 虚拟机。下面介绍eclipse 是如何选择用什么方式来运行jvm]

 

寻找一个java 虚拟机和使用jni invocation api
eclipse 启动者在eclipse 进程中使用java native interface invocation api 加载java 虚拟机。启动者仍然可以像先前的eclispe 版本中那样,在一个分开的进程中启动JVM。究竟采用哪种方法来启动,取决于启动者如何找到VM。

 

1  当没有 -vm 参数时,启动者在eclipse 根目录中的一个jre 路径中寻找VM,然后在搜索path 环境变量。如果java 被找到,启动者在相对java 可执行文件的路径中,寻找一个jvm 共享库(在windows 上为jvm.dll, 在linux 上为libjvm.so )。
    1) 如果一个jvm 共享库被找到,启动者加载它,并用jni invocation api 来启动VM。
    2) 如果一个jvm 共享库没有被找到,启动者执行在一个新的进程中启动java 启动者(java.exe/javaw.exe)来启动vm。

 

2  -vm 被特殊化,在命令行中,或者在eclispe.ini 中
    eclispe 可以通过"-vm <location>" 来选择哪个VM 被使用。<location> 这个值有几种可能的取值。
       1) 路径(directory):<location> 是一个路径。我们将在这个路径中寻找: (1) 一个java 启动者 or (2) jvm 共享库. 如果找到了jvm 共享库, 我们调用JNI invocation.

如果找到一个java 启动者, 则在这个路径下找jvm 共享库. 如果我们找到了, 调用JNI invocation. 如果没有找到jvm 共享库, 在一个新的进程中执行java。
       2) java.exe/javax.exe:<location> 是一个java 启动者路径。我们在一个新的进程中执行java 启动者来启动VM。
       3) jvm dll 或so:<location> 是一个jvm 共享库的路径。我们尝试加载这个库,并在当前进程中使用jni invocation api 来启动vm。

 

例外情况:
linux.ppc, linux.x86_64, aix.ppc:  The launcher is not able to load some older vms using the JNI invocation API.  By default on these platforms the launcher
will prefer to execute java in a separate process.  To force the launcher to load the vm using JNI, specify a -vm option pointing directly to the vm's shared library (libjvm.so).
MacOSX:  The launcher uses the system JavaVM framework and will always load the vm in-process using the JNI invocation API.(在苹果的mac 系统中,永远采用在进
程内加载jvm 来运行java 程序)

 

CVS 的变更可以参考:http://wiki.eclipse.org/Equinox_Eclipse_to_RT_Migration

原创粉丝点击