`

分析Eclipse源代码,理解OSGI插件机制内幕

 
阅读更多

 

原网址:http://blog.csdn.net/zajin/article/details/9450883

 

一、概述

        一直关注我blog的朋友会看到,最近我一直在关注Eclipse源代码的编译工作,但除了简单的编译设置和烦琐而极具耐心的源代码剥离,似乎还没有什么 太有趣的东西出现。现在,经过了前面一系列的热身运动,我将和大家一起走入Eclipse的内核,看看它到底是怎么工作的?

        1、Eclipse源代码        版本:3.1.1        大小:63.2MB

        eclipse-sourceBuild-srcIncluded-3.1.1.zip

        下载地址:http://download.eclipse.org/eclipse/downloads

        2、源代码阅读工具        Source Insight  V3.5

         它其实是一个代码编辑软件,因为有强大的代码分析工具,可以很方便地跟踪代码的相关性,所以常用来作为阅读代码的工具。

         下载地址:http://sourceinsight.com/down35.html

         为了方便代码的分析,我们只提取以下几个插件的代码:

org.eclipse.platform                             org.eclipse.platform_3.1.1.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

         将这些代码解压缩到一个空目录里,然后导入到Source Insight的Project里。     

二、Eclipse启动过程

        首先我们从Eclipse的启动过程开始分析。

        1、eclipse.exe

        它是Eclipse的启动文件,是与平台相关的可执行文件。它的功能比较简单,主要是加载startup.jar文件,代码在Eclipse源代码的 /features/org.eclipse.platform.launchers/library目录下,对应多个平台。对于win32平台,你可以 直接运行win32目录下的build.bat文件来编译得到它(需要安装C编译器)。

        2、startup.jar

        这个是Eclipse真正的启动文件,你可以在命令行下运行java -jar startup.jar命令来启动Eclipse。它的入口是org.eclipse.core.launcher.Main,它对应的源代码在 org.eclipse.platform/src目录的子目录下的Main.java。我们从main函数往后跟踪,找到basicRun,这个是启动 的主要部分。

protected void basicRun(String[] args) throws Exception {
        ......
        setupVMProperties();                  //设置VM属性
        processConfiguration();             //读取configuration/config.ini配置文件
        ......
        // need to ensure that getInstallLocation is called at least once to initialize the value.
        // Do this AFTER processing the configuration to allow the configuration to set
        // the install location.  
        getInstallLocation();

        // locate boot plugin (may return -dev mode variations)
        URL[] bootPath = getBootPath(bootLocation);

        setSecurityPolicy(bootPath);       //设置执行权限

        // splash handling is done here, because the default case needs to know
        // the location of the boot plugin we are going to use
        handleSplash(bootPath);

        invokeFramework(passThruArgs, bootPath);            //启动Eclipse内核
    }

这个函数前面部分是设置一些属性,最关键的是最后invokeFramework函数,它是启动Eclipse的核心。下面我们看看invokeFramework函数的具体内容。

private void invokeFramework(String[] passThruArgs, URL[] bootPath) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, Error, Exception, InvocationTargetException {
        ......
        URLClassLoader loader = new StartupClassLoader(bootPath, parent);

        Class clazz = loader.loadClass(STARTER);             //加载   String STARTER = "org.eclipse.core.runtime.adaptor.EclipseStarter";
        Method method = clazz.getDeclaredMethod("run", new Class[] {String[].class, Runnable.class});          //获得run方法
        ......
        method.invoke(clazz, new Object[] {passThruArgs, endSplashHandler});           //调用run方法
        ......
    }

首先创建加载器loader,它是一个URLClassLoader类型。接着加载类"org.eclipse.core.runtime.adaptor.EclipseStarter",获得其run方法,然后调用此方法。

        3、OSGI启动

        "org.eclipse.core.runtime.adaptor.EclipseStarter"类的源代码位于/plugins /org.eclipse.osgi/eclipseAdaptor/src/org/eclipse/core/runtime/adaptor。可见 它已经位于OSGI包内,它是OSGI的启动类。

 public static void startup(String[] args, Runnable endSplashHandler) throws Exception {
  ......
  adaptor = createAdaptor();              //建立适配器
  ......
  OSGi osgi = new OSGi(adaptor);                 //建立OSGI对象,这就是我们要找的东西
  ......
  osgi.launch();          //启动OSGI
  ......
  context = osgi.getBundleContext();                  //获得已加载的Bundle的执行上下文
  ......
  Bundle[] startBundles = loadBasicBundles();              //加载Bundle
  setStartLevel(getStartLevel());             //设置启动级别
  ......
 }

分享到:
评论

相关推荐

    OSGI 实例eclipse插件开发

    首先,Eclipse是一个开放源代码的集成开发环境(IDE),它支持多种编程语言的开发,而OSGI则为Eclipse提供了一个强大的插件系统。通过OSGI,开发者可以创建独立、可重用的插件,这些插件可以互相交互并与其他Eclipse...

    OSGI.rar_OSGI eclipse_eclipse osgi_java OSGI_osgi

    OSGI(Open Services Gateway Initiative)是一种模块化系统和Java...总的来说,通过这个压缩包,开发者可以深入理解OSGI在Eclipse中的应用,提升在Java环境中进行模块化开发的能力,并掌握动态、灵活的软件构建方式。

    Eclipse RCP与Spring OSGi技术详解与最佳实践

    《Eclipse RCP与Spring OSGi:技术详解与最佳实践》由资源的Eclipse专家亲自执笔,并得到了Eclipse官方技术社区的强烈推荐,权威性毋庸置疑!内容全面,系统讲解了利用Eclipse RCP和Spring OSGi开发大规模Java应用的...

    org.eclipse.osgi_3.7.0.v20110613及源码

    org.eclipse.osgi-3.7.0.v20110613-sources.jar文件包含了org.eclipse.osgi的源代码,对于开发者来说,这是理解和学习OSGi框架内部运作的重要资源。通过阅读源码,我们可以看到如何创建和管理bundle,如何处理bundle...

    深入理解OSGi:Equinox原理、应用与最佳实践源代码+equinox-SDK-3.8源代码

    6. **源代码分析**:附带的equinox-SDK-3.8源代码可以让开发者深入理解Equinox的实现细节,包括bundle的生命周期管理、服务注册和事件处理等。 7. **最佳实践**:书中的最佳实践部分可能会指导如何有效地设计和组织...

    osgi 3.7.1 源代码

    工作中用到了osgi,又需要阅读或者修改osgi的源代码,好不容易找到了3.71版的,其实我需要的只是org.eclipse.osgi.source_3.7.1.R37x_v20110808-1106.jar,里面有osgi类加载相关的代码,它位于压缩包的equinox-SDK-...

    深入理解OSGi:Equinox原理、应用与最佳实践,书本源代码

    9. **源代码分析**:书本源代码通常包含示例和练习,帮助读者深入理解OSGi和Equinox的工作原理,提供实践经验,以便于在实际项目中应用所学知识。 通过学习这个主题,开发者不仅可以提升对模块化编程的理解,还能...

    Eclipse插件开发学习笔记-源代码1至24章.zip

    本学习笔记涵盖从基础到进阶的Eclipse插件开发全过程,通过24个章节的源代码实例,旨在帮助开发者掌握如何创建、调试和发布Eclipse插件。 在Eclipse插件开发中,首先需要理解的是OSGi(Open Services Gateway ...

    OSGi进阶源代码

    **OSGi进阶源代码详解** OSGi(Open Services Gateway Initiative...通过对这些源代码的深入学习,开发者不仅可以理解OSGi的基本概念,还能掌握如何在实际项目中集成和利用SSH框架,提升Java应用的模块化和可扩展性。

    Eclipse3.0采用的OSGi技术

    - **解决方案:** 通过采用 OSGi,Eclipse 3.0 实现了动态插件管理,这意味着用户可以随时安装、卸载或更新插件而无需重启平台。 - **优势:** 这大大提升了开发效率,并为用户提供了更加灵活的工作环境。 **2. ...

    在Eclipse RCP中应用Spring OSGI 管理bean(一)

    在提供的压缩包文件“martinlippert-spring-extension-factory-2394025”中,可能包含了一个示例项目的源代码,它展示了如何创建和使用SpringExtensionFactory。通过阅读和分析源码,可以深入了解这个过程,并将概念...

    OSGI.rar_OSGI eclipse_osgi

    `OSGI.pdf`可能是理论介绍和最佳实践的文档,而`OSGI实战-dist.rar`和`OSGI实战-code.rar`很可能是包含示例项目和源代码的压缩包,帮助读者深入理解和学习OSGI在实际开发中的应用。 通过学习这些资源,你可以了解到...

    osgi插件化开发流程

    osgi插件化开发流程

    基于Eclipse开发OSGI的简单实例

    **基于Eclipse开发OSGI的简单实例** OSGi(Open Services Gateway Initiative)是一种...阅读`OSGI.doc`、`純OSGI方式`和`SPringDM方式源碼`中的文档和代码,将有助于更深入理解和掌握OSGi在Eclipse环境下的开发技术。

    OSGi实战 实例源代码

    这个“OSGi实战 实例源代码”是BlueDavy的opendoc《OSGi实战》一书中的配套实践代码,为初学者提供了深入理解OSGi机制的宝贵资源。通过这些源代码,读者可以更好地掌握OSGi的核心概念,包括服务、模块化、依赖管理和...

    eclipse plugin源代码 完整工程

    本项目是一个完整的Eclipse插件工程,名为"CoreyPlugin",包含了作者自己编写的源代码,展示了如何扩展Eclipse的多个功能点,构建一个基础的扩展模型。 首先,我们要理解Eclipse插件的工作原理。Eclipse采用OSGi...

    深入理解OSGi:Equinox原理、应用与最佳实践.pdf

    例如,Eclipse IDE就是基于OSGi框架构建的,它允许开发者动态地添加、卸载插件而不需要重启整个开发环境。在企业应用中,OSGi可以用来构建服务网关或者中间件,以支持微服务架构。 由于OSGi提供了一个严格的模块化...

    OSGI进阶插件开发

    1. **插件系统**:利用OSGi创建可扩展的应用程序框架,如Eclipse IDE就是基于OSGi的插件系统。 2. **分布式系统**:在多节点环境中,OSGi的动态性可以帮助构建灵活的微服务架构。 3. **设备管理**:在物联网(IoT)...

    eclipse插件

    在Eclipse插件开发中,jad可以作为调试工具,辅助分析插件的执行过程。例如,当遇到某些问题时,可以通过jad反编译插件的字节码,查看其底层的机器指令,从而找出问题的根源。 **源码阅读** 在Eclipse插件开发中,...

Global site tag (gtag.js) - Google Analytics