在Eclipse插件开发中, MANIFEST.MF, plugin.xml, build.properties是三种最常见的文件,由于它们共享同一个编辑器(Plug-in Manifest Editor),经常会有插件开发者误解、混淆了这三个文件的用途。我们来看看这三个文件有哪些区别。

1、在编辑器上的区别

我们来看看Plug-in Manifest Editor是什么样子的:

上图是manifest编辑器的Overview签页的项目。注意编辑器的底部,有多个签页。

其中,Overview、Dependencies、Runtime,三个签页是MANIFEST.MF文件的图形化编辑器。

Extensions、Extension Points,两个签页是plugin.xml文件的图形化编辑器。

Build签页则是build.properties文件的图形化编辑器。

最后的三个签页MANIFEST.MF、plugin.xml、build.properties分别为对应文件的文本编辑器。

2、功能上的区别

我们知道,静态文本通常用来作为配置文件。

MANIFEST.MF对于Java程序员来说是个常见的文件(不知道的回去面壁),它用来标识当前jar包的各种属性的,如果你做过“可双击启动的jar包”,应该能想起这个文件。

MANIFEST.MF里有一般属性,也有一些和其他体系约定俗称的属性,也可以添加自定义的属性。

比如在插件开发里,一个插件项目的MANIFEST.MF基本会具备如下属性:

有些插件开发者会疑惑。为什么同样是一个jar包,有些会被Eclipse认同为bundle(不懂这个词的插件开发者去面壁),有些只能认同为普通的jar。

这个MANIFEST.MF的内容就是关键了,普通的jar包是不会具备这些bundle信息的。

在Eclipse(具体来说是equinox)找到这个插件jar的时候,会读取其MANIFEST.MF文件,以获取其名称,版本号,依赖关系,等。

然后完成我们所知的插件加载过程。

即是说,MANIFEST.MF是用来配置插件的元信息的,其属性的名和值,需要符合OSGi规范。

OSGi以MANIFEST.MF为依据,来启动插件,计算依赖性,决定约束(constraint)等等,其他的OSGi框架比如felix,也可以读取识别它。

该文件的使用发生在插件加载之前。

plugin.xml是为Eclipse的扩展点和扩展服务的。

很多人混淆了扩展点和扩展的概念。

下图所做的操作,相信插件开发人员都做过:

这一系列的完整的操作,我们应该称之为“选择了org.eclipse.ui.editors扩展点,并添加了一个扩展”

扩展点,即是Extension Point,扩展点本身其实不具备功能,它仅仅只是个“格式规范”,一个“schema”,本质上,它是个类DTD定义。

扩展,即是Extension,它是真正的配置项(XML格式),用户根据扩展点的约束填入合适的值,以完成配置。

这里不会赘述一个扩展是如何生效的,有兴趣的同学可以尝试自己定义一个“扩展点”,然后完善它的exsd定义文件。

在代码里查询扩展点内容使用如下代码:

Platform.getConfigurationElementsFor(String extensionPointId);

如此可知,plugin.xml是为了扩展点和扩展服务的,是Eclipse的专属内容。它的使用发生在插件被加载之后。

build.properties,属性文件相信大家并不陌生,插件在打包的过程中,需要提供给ant脚本一些变量,这些变量就记录在build.properties文件中。

该文件会在插件或者产品导出的时候使用到。

RCP: MANIFEST.MF, plugin.xml, build.properties三种文件的区别的更多相关文章

  1. python实现XML解析的三种方法

    python实现XML解析的三种方法 三种方法:一是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合:二是xml.sax.*模块,它是SAX API的实 ...

  2. 链接属性rel=’external’、rel=’nofollow’、rel=’external nofollow’三种写法的区别

    链接属性rel='external'.rel='nofollow'.rel='external nofollow'三种写法的区别   大家应该都知道rel='nofllow'的作用,它是告诉搜索引擎, ...

  3. Objective-C:三种文件导入的方式以及atomic和nonatomic的区别

    一.三种文件导入的方式比较:   类的前项声明@class.import.include: 1.采用@class 类名的方式,它会告诉编译器有这么一个类,目前不需要知道它内部的实例变量和方法是如何定义 ...

  4. Objective-C:三种文件导入的方式比较

    三种文件导入的方式比较:   类的前项声明@class.import.include:   1.采用@class 类名的方式,它会告诉编译器有这么一个类,目前不需要知道它内部的实例变量和方法是如何定义 ...

  5. <script>, <script async>, <script defer> 三种标签的区别

    <script>, <script async>, <script defer> 三种标签的区别 <script>标签 阻塞html parsing 脚 ...

  6. Iass、Pass、SasS三种云服务区别?

    Iass.Pass.SasS三种云服务区别 我们可以把云计算理解成一栋大楼,而这栋楼又可以分为顶楼.中间.低层三大块.那么我们就可以把Iass(基础设施).Pass(平台).Sass(软件)理解成这栋 ...

  7. 《Java多线程面试题》系列-创建线程的三种方法及其区别

    1. 创建线程的三种方法及其区别 1.1 继承Thread类 首先,定义Thread类的子类并重写run()方法: package com.zwwhnly.springbootaction.javab ...

  8. jQuery中detach&&remove&&empty三种方法的区别

    jQuery中empty&&remove&&detach三种方法的区别 empty():移除指定元素内部的所有内容,但不包括它本身 remove():移除指定元素内部的 ...

  9. vue定义data的三种方式与区别

    在vue中,定义data可以有三种写法. 1.第一种写法,对象. var app = new Vue({ el: '#yanggb', data: { yanggb: 'yanggb' } }) 2. ...

随机推荐

  1. Python 字符串分割的方法

    在平时工作的时候,发现对于字符串分割的方法用的比较多,下面对分割字符串方法进行总结一下:第一种:split()函数split()函数应该说是分割字符串使用最多的函数用法:str.split('分割符' ...

  2. android6.0锁屏界面接收新通知处理流程

    灭屏状态下,接收新信息,屏幕会半亮显示通知流程: 1,应用构造notification后,传给NotificationManager,而后进入NotificationManagerService处理. ...

  3. Linux中的工作管理(Job Control )

    以前使用Linux老是会不小心按下Ctrl + z,然后就出现看不懂的情况,以为程序突然就没了,今天专门研究了下Linux下的几个快捷键和工作管理. 其中找到一篇很不错的文章,大部分是里面转载的. 原 ...

  4. linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)(zz)

    linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl) 分类: linux2011-10-10 13:21 8773人阅读 评论(1) 收藏 举 ...

  5. 原生JS中apply()方法的一个值得注意的用法

    今天在学习vue.js的render时,遇到需要重复构造多个同类型对象的问题,在这里发现原生JS中apply()方法的一个特殊的用法: var ary = Array.apply(null, { &q ...

  6. 【章老师的课程】Black Box Testing

    本周我们学习了黑盒测试,这是一种常用的软件测试方法,它将被测软件看作一个打不开的黑盒,主要根据功能需求设计测试用例,进行测试.本章主要介绍几种常用的黑盒测试方法和黑盒测试工具,并通过实例介绍各种方法的 ...

  7. 复合梯形公式与Simpson公式的数值积分

    #include <iostream>#include<math.h>#include<stdio.h>using namespace std; float f(f ...

  8. oracle后台进程详解

    oracle后台进程伴随实例的启动而启动,他们主要是维护数据库的稳定,相当于一个企业中的管理者及内部服务人员.他们并不会直接给用户提供服务.   一:database write--数据写入  DBW ...

  9. TCP头部结构

    3.2 TCP头部结构 TCP头部信息出现在每个TCP报文段中,用于指定通信的源端端口,目的端端口,管理TCP连接等,本节详细介绍TCP的头部结构,包括固定头部结构和头部选项. 3.2.1 TCP固定 ...

  10. PHP-仿ecshop生成验证码

    <?php /* 生成验证码 */ // 1.创建画布(基于已有图像) $n = mt_rand(1,5); $im = imagecreatefromjpeg('./images/captch ...