原文链接 http://blog.csdn.net/gonxi/archive/2006/02/26/610146.aspx
一、概述
一直关注我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()); //设置启动级别
......
}
分享到:
相关推荐
首先,Eclipse是一个开放源代码的集成开发环境(IDE),它支持多种编程语言的开发,而OSGI则为Eclipse提供了一个强大的插件系统。通过OSGI,开发者可以创建独立、可重用的插件,这些插件可以互相交互并与其他Eclipse...
3. **Eclipse与OSGI**:Eclipse是如何基于OSGI构建的,每个插件如何作为OSGI Bundle运行,以及如何通过Eclipse插件系统利用OSGI的灵活性。 4. **模块化开发**:如何将应用程序分解为可独立升级的模块,降低耦合度,...
《Eclipse RCP与Spring OSGi:技术详解与最佳实践》由资源的Eclipse专家亲自执笔,并得到了Eclipse官方技术社区的强烈推荐,权威性毋庸置疑!内容全面,系统讲解了利用Eclipse RCP和Spring OSGi开发大规模Java应用的...
org.eclipse.osgi-3.7.0.v20110613-sources.jar文件包含了org.eclipse.osgi的源代码,对于开发者来说,这是理解和学习OSGi框架内部运作的重要资源。通过阅读源码,我们可以看到如何创建和管理bundle,如何处理bundle...
6. **源代码分析**:附带的equinox-SDK-3.8源代码可以让开发者深入理解Equinox的实现细节,包括bundle的生命周期管理、服务注册和事件处理等。 7. **最佳实践**:书中的最佳实践部分可能会指导如何有效地设计和组织...
工作中用到了osgi,又需要阅读或者修改osgi的源代码,好不容易找到了3.71版的,其实我需要的只是org.eclipse.osgi.source_3.7.1.R37x_v20110808-1106.jar,里面有osgi类加载相关的代码,它位于压缩包的equinox-SDK-...
9. **源代码分析**:书本源代码通常包含示例和练习,帮助读者深入理解OSGi和Equinox的工作原理,提供实践经验,以便于在实际项目中应用所学知识。 通过学习这个主题,开发者不仅可以提升对模块化编程的理解,还能...
本学习笔记涵盖从基础到进阶的Eclipse插件开发全过程,通过24个章节的源代码实例,旨在帮助开发者掌握如何创建、调试和发布Eclipse插件。 在Eclipse插件开发中,首先需要理解的是OSGi(Open Services Gateway ...
**OSGi进阶源代码详解** OSGi(Open Services Gateway Initiative...通过对这些源代码的深入学习,开发者不仅可以理解OSGi的基本概念,还能掌握如何在实际项目中集成和利用SSH框架,提升Java应用的模块化和可扩展性。
标题中的“在Eclipse RCP中应用Spring OSGI 管理bean(一)”表明这是一篇关于如何在Eclipse Rich Client Platform (RCP)应用程序中集成Spring框架,并利用OSGi服务来管理Bean的教程。Eclipse RCP是一个用于构建桌面...
- **解决方案:** 通过采用 OSGi,Eclipse 3.0 实现了动态插件管理,这意味着用户可以随时安装、卸载或更新插件而无需重启平台。 - **优势:** 这大大提升了开发效率,并为用户提供了更加灵活的工作环境。 **2. ...
`OSGI.pdf`可能是理论介绍和最佳实践的文档,而`OSGI实战-dist.rar`和`OSGI实战-code.rar`很可能是包含示例项目和源代码的压缩包,帮助读者深入理解和学习OSGI在实际开发中的应用。 通过学习这些资源,你可以了解到...
**基于Eclipse开发OSGI的简单实例** OSGi(Open Services Gateway Initiative)是一种...阅读`OSGI.doc`、`純OSGI方式`和`SPringDM方式源碼`中的文档和代码,将有助于更深入理解和掌握OSGi在Eclipse环境下的开发技术。
osgi插件化开发流程
这个“OSGi实战 实例源代码”是BlueDavy的opendoc《OSGi实战》一书中的配套实践代码,为初学者提供了深入理解OSGi机制的宝贵资源。通过这些源代码,读者可以更好地掌握OSGi的核心概念,包括服务、模块化、依赖管理和...
本项目是一个完整的Eclipse插件工程,名为"CoreyPlugin",包含了作者自己编写的源代码,展示了如何扩展Eclipse的多个功能点,构建一个基础的扩展模型。 首先,我们要理解Eclipse插件的工作原理。Eclipse采用OSGi...
1. **插件系统**:利用OSGi创建可扩展的应用程序框架,如Eclipse IDE就是基于OSGi的插件系统。 2. **分布式系统**:在多节点环境中,OSGi的动态性可以帮助构建灵活的微服务架构。 3. **设备管理**:在物联网(IoT)...
例如,Eclipse IDE就是基于OSGi框架构建的,它允许开发者动态地添加、卸载插件而不需要重启整个开发环境。在企业应用中,OSGi可以用来构建服务网关或者中间件,以支持微服务架构。 由于OSGi提供了一个严格的模块化...
5. **安全机制**:Eclipse OSGi内核还提供了一套安全模型,允许管理员对Bundle的访问权限进行控制,防止恶意代码对系统造成破坏。 6. **类加载器**:在OSGi中,每个Bundle有自己的类加载器,这样可以防止类冲突,...