eclipse插件原理简介

eclipse概述

作为java开发人员都知道eclipse是一个开源的开发平台,而且本身也是用java语言开发的。其实但就其本身而言不是一个整块的程序,它只是一个框架和一组服务,包含了一个插件载入器、由成百上千的插件组成的小内核。该内核是OSGI规范的一个实现,为各种此插件执行提供环境。每个插件以结构化的方式在整体中发挥作用,可能依赖于由其他插件提供的服务,也可能提供其他插件需要的服务。这种模块化的设计让eclipse自身分解为不同的功能块。这些功能块能更容易地被重用于创建超出原始开发人员视野之外的应用程序。就如不同版本的eclipse分别为特定的功能而设定。eclipse附带了标准的插件集,包括java开发工具JDK,还包括插件开发环境PDE。而PDE组件主要为扩展eclipse插件开发使用。

OSGI
OSGi(开放服务网关协议,Open Service Gateway Initiative)技术是Java动态化模块化系统的一系列规范,由OSGi Alliance组织制定的一个基于Java语言的规范。该规范和核心部分是一个框架,其中定义了应用程序的生命周期模式和服务注册。实现了一个优雅、完整和动态的组件模型。应用程序(称为bundle)无需重新引导可以被远程安装、启动、升级和卸载。
OSGI框架一般具备的基础功能:
模块化的动态部署。基于OSGI而构建的系统可以以模块化的方式动态地部署至框架中,从而增加、扩展或改变系统的功能。支持模块化的封装和交互。每个工程(模块)可通过声明Export-Package对外提供访问此工程的类和接口。
模块的动态扩展。基于OSGI提供的面相服务的组件模型的设计方法,以及OSGI实现框架提供的扩展点方法可实现模块的动态扩展。模块化的设计。在OSGI中模块由一个或多个bundle构成,模块之间的交互通过Import-Package、Export-Package以及OSGI Service的方式实现。
动态化的设计。动态化的设计是指系统中所有的模块必须支持动态的插拔和修改,“即插即用,即删即无”。
可扩展的设计。通常使用定义扩展点的方式。按照Eclipse推荐的扩展点插件的标准格式定义bundle中的扩展点,其它要扩展的bundle可通过实现相应的扩展点来扩展该bundle的功能。每个bundle拥有独立的class loader,通过它来完成本bundle类的加载。
稳定、高效的系统。基于OSGI的系统采用的是微核机制,微核机制保证了系统的稳定性,微核机制的系统只要微核是稳定运行的,那么系统就不会崩溃,也就是说基于OSGI的系统不会受到运行在其中的bundle的影响,不会因为bundle的崩溃而导致整个系统的崩溃。

说白了就是所有的东西都是模块化,他们相互独立又可以按照规则选择性依赖,随时用随时启动,用完就停,一个坏了不影响其他的。(有木有觉得有种熟悉感觉,就像现在流行的微服务,eclipse很早都在使用这种设计模式,是不是很牛)

插件生命周期
六个生命周期:INSTALLED, RESOLVED, STARTING, ACTIVE, STOPPING, UNINSTALLED。
eclipse插件原理简介_第1张图片
installed和unstalled字面都能理解安装和卸载,resolved表示该bundle已经安装成功,依赖也已经计算完毕,具备能称之为一个bundle的全部条件。这个状态下的bundle的类是可以使用也可以被其他bundle使用,就是已经就绪的状态。Bundle开始使用被激活后,Activator的start方法会被触发,然后该bundle的本地的资源就可以被加载了,然后进入starting、active状态,当停止使用进入stopping状态。这些状态中只用active的状态代表了插件时正常启动使用的,其他都代表插件未成功启动。
Eclipse的执行文件eclipse.exe创建快捷方式,然后在快捷方式目标处加上-console,即可看见osgi console后台,或者在eclipse中打开console视图,在视图Open Console列表中找到Host OSGi console打开。这里可以在osgi>标记后输入合适的osgi命令,比如ss,可以显示所有插件及状态。ss m2e可以搜索m2e的插件。
eclipse插件原理简介_第2张图片

其他常用命令

命令 用途
ss 展示已安装的bundle
install 通过指定url文件安装对应的为bundle
uninstall 卸载指定Id标识的bundle
start 启动指定Id标识的bundle
stop 停止指定Id标识的bundle
update 同步bundle和bundle的加载文件

插件结构
每个插件的行为都位于代码中,然而插件的依赖项和服务都在MANIFEST.MF和plugin.xml文件中声明。这种结构从当需要时的角度简化了插件代码的延迟载入。因此也减少了启动时间和内存占用。
在启动时插件载入器为每个插件扫描MANIFEST.MF和plugin.xml文件,然后创建一个包含该信息的结构。该结构占用少量的内存空间,载入器可以通过他快速的找到所需要的插件。
eclipse插件原理简介_第3张图片
src:插件的业务代码
icons:插件使用都的图标
META-INF/MANIFEST.MF:描述插件运行特性的文件,定义了插件的各种标识符、版本、依赖项、启动器、提供者等信息
plugin.xml:描述插件扩展点的配置文件
build.properties:定义插件打包信息的配置文件
plugin.properties:插件的配置文件,是可选的,可以将plugin.xml中的参数统一配在该文件中,可以用来做I18N国际化配置。

PDE为三种配置文件提供了特定的编辑器,可以source编码的方式,也可以可视化窗口的方式配置。Overview配置插件的基本信息包括名称,id,版本,jdk等;Dependencies配置所需要的其他插件比如常用的org.eclipse.ui、org.eclipse.core.runtime、org.eclipse.core.resource或者其他插件对外提供的服务包;Runtime中配置对外提供的服务包和运行时classpath(插件的classpath在这里配置不要再项目右键build path中配置)、Extensions和Extension Points配置插件的扩展和扩展点,比如需要做个向导功能,需要添加org.eclipse.ui.newWizards的扩展,需要做个试图的功能窗口需要添加org.eclipse.ui.views的扩展。
eclipse插件原理简介_第4张图片
插件启动器
如上图MANIFEST.MF中配置的Bundle-Activator就是插件的启动器类,该类需要实现BundleActivator接口,重写start和stop方法。当插件通过start方法被载入或者通过strop方法关闭时,插件载入器将通知启动器。如果覆盖start和stop方法时请谨慎,尽量取少量的操作,页面影响eclipse启动和关闭速度。如果基于UI的插件(需要org.eclipse.ui的插件)的启动器继承BundleActivator的一个实现类AbstractUIPlugin。该类提供了访问窗口所需图片的方法getImageRegistry().get(key)。

public class Activator implements BundleActivator {

	private static BundleContext context;

	static BundleContext getContext() {
		return context;
	}

	public void start(BundleContext bundleContext) throws Exception {
		Activator.context = bundleContext;
	}
	public void stop(BundleContext bundleContext) throws Exception {
		Activator.context = null;
	}

}

由于eclipse时懒加载模式,因此在启动时他可能不会调用start()方法,如果需要在eclipse启动时就载入一些信息,可以通过在插件清单中插入org.eclipse.ui.startup扩展点,实现一个org.eclipse.ui.IStartup的监听器,重写earlyStartup()方法。这样工作台就可以在UI完成启动后调用earlyStartp()方法。

<extension point="org.eclipse.ui.startup">
      <startup class="com.test.myplugin.StartupListener"/>
</extension>

创建简单的插件工程
通过eclipse的创建工程向导 new->other->plug-in development->plug-in project进入创建流程,填写插件名,一般类似maven的groupId的格式
eclipse插件原理简介_第5张图片
填写插件基本信息,和启动器
eclipse插件原理简介_第6张图片
PDE提供了hello world和一些模板供使用,如果对插件的扩展点有初步了解的可以选择第一个custom plugin wizard定制向导
eclipse插件原理简介_第7张图片
定制向导中勾选需要用到的扩展,比如试图的扩展,向导的扩展,后面的可以直接默认,点击finish一个简单的插件功能就生成好。
eclipse插件原理简介_第8张图片
插件打包
插件打包的方式有两种,直接打成jar,或者打成zip的安装包。一般作为开发人员更喜欢jar的文件,而且打jar的方式比较简单点,这里介绍这种方式。

右击插件工程 export->Deployable plug-ins and fragments
eclipse插件原理简介_第9张图片
填写导出的位置,options中可以配置版本号后的时间戳,点击finish。打好的jar包直接拷贝到eclipse的plugins目录中,重启即可。
eclipse插件原理简介_第10张图片

你可能感兴趣的:(eclipse插件原理简介)