在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. three.js 根据png生成heightmap

    Three.js: render real world terrain from heightmap using open data By jos.dirksen on Tue, 07/17/2012 ...

  2. 深入理解Java虚拟机(三)、垃圾收集算法

    1.第一门真正使用内存动态分配和垃圾收集技术的语言:Lisp 2.程序计数器.虚拟机栈.本地方法栈这3个区域随线程而生灭,这几个区域的内存会随着方法结束或线程结束而回收,GC关注的是Java堆和方法区 ...

  3. PHP的文件格式应该以UTF-8无BOM编码

    前一段时间写PHP,经常在解析文件之前就要对数据进行处理判断,并以header()的方式进行页面跳转.然而后来将文件放到 linux 服务器时常碰到header()解析出错的情况,而在 windows ...

  4. ubuntu下安装wordpress

    网上大多都是说放在var/www下面 实际上新版的ubuntu默认放在 var/www/html 下面 当然这个配置是可以修改的

  5. Oracle 中的作业队列和队列调度

    一,启动执行作业的进程       在 Oracle 中,是使用 “作业队列协调进程(CJQ0)” 这个协调数据库实例的作业队列的后台进程,来监视作业队列中的作业表(JOB$),并启动作业队列进程(J ...

  6. 对于cookie和session的形象解释

    生活中的场景: 一群人,买豆浆,也不排队,乱哄哄的 豆浆现磨. 先交钱,交完钱蹲在一边等. 这个老板非常健忘! 记忆时间:转脸就忘. 李四给老板钱<--->"大杯黄豆!" ...

  7. win7 部署WCF遇到的问题记录

    1. IIS7 handler Mappings默认没有*.svc 的处理,需要安装(页面错误提示好像会提示缺少相应的处理器,记不清楚了) 方法:使用 ServiceModelReg.exe 工具 路 ...

  8. Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包

    今天开始系统的学习QT,第一个测试的问题就是在纯净的系统中如何正常运行,也就是找出QT生成的exe的依赖库问题 网上搜了下可以简单粗暴的用 D:\Qt\Qt5.6.0\5.6\msvc2015\bin ...

  9. CentOS访问Windows共享文件夹的方法

    CentOS访问Windows共享文件夹的方法 1 在地址栏中输入下面内容: smb://Windows IP/Share folder name,smb为Server Message Block协议 ...

  10. JavaScript标准库之——JSON

    JSON 对象包含了两个方法,一是解析 JavaScript Object Notation (JSON),二是将值转换为 JSON.这个对象本身不能被调用或者作为构造函数,除了它的这两个方法属性外 ...