Eclipse零起步(10)
(前言)
今天我们介绍一下pde, 如果让你自己写plugin.xml这个配置文件,估计也比较头疼,所以
啊,还是有工具的好,呵呵.
(正文)
[PDE 简介]
PDE 也是eclipse内置的一个插件, 英文名是Plug-in Development Environment, 是eci
lpse team为了帮助用户更好的
开发eclipse插件而开发的一个平台, 专门用来开发插件.
其实第七讲中,我们试过的一个hello world例子,能这么快生成, 编译,运行, 测试都是p
de的功劳.
PDE主要有一下几个功能:
1. 向导, 包括新建插件工程向导, 新建扩展(extension)向导, 生成扩展控制类向导等
等
2. 编辑, 主要是提供了一个对plugin.xml, 也包括(feature.xml, fragment.xml,
site.xml)的可视化编辑
3. 测试和部署, pde提供了一个running workbench, 可以用来运行测试插件, 还可以进
行单步调试等,而且等插件开发
好后还提供方便的部署插件的功能,能方便把你编辑的项目导出为一个可部署的插件
而以后要开发插件的同志, 那就要先好好研究一下这个东东了, 对它的掌握程度直接影
响到你开发插件的效率问题.
关于PDE的详细介绍,可参看eclipse联机帮助中的PDE Guide,有详细介绍
[PDE 配置]
用之前,一般都要做一个配置,就是设置一下目标平台, 因为这涉及到编译插件时的类路
径问题.
要设置在preference-> plugin development -> target platform中, enable 所有的插
件, 也就是点一下not in
workspace按钮,然后apply或直接ok. 这样编译插件的时候, pde会自动check你这个插件
项目的dependency,然后根据你
的dependency,为你设置正确的classpath路径.
如果你一个要被dependency的插件没有enable, 那pde就找不到这个插件,也就找不到这
个插件的运行库,也就无法设置
classpath了.
总之,开发插件前, 设置一下就ok了
[新建项目]
开发插件,其实不止plugin, 还有feature, site, fragment等等, 可以通过不同的向导
来生成你要的. 今天先介绍
plugin, 其他的以后说, 而且使用向导新建一个plugin已经介绍过了,这里就不多说了
[plugin.xml 编辑]
打开plugin.xml, 一个plug-in manifest editor就打开了, 它是一个多页编辑器, 分为
welcome, overview,
dependency, runtime extensions, extension points 和source 这几页.
welcome page: 是一个使用这个东东的简介, 如果你不熟悉,可以先看看这页, 它会教你
一些使用的步骤, 如果你不想以
后再看到这页, 那可以勾一下在这页里下面的一个选择框, 让这页下次不用显示.
overview page: 是对这个插件的一个概览, 这页可以修改的是这个插件的id,
name,version, provide name 和 class
对应的源代码是:
id="MyPlugin"
name="MyPlugin Plug-in"
version="1.0.0"
provider-name=""
class="MyPlugin.MyPluginPlugin">
dependency page: 这页就是设置当前插件需要依赖的插件有哪些,比如你开发一个hello
world中就要依赖org.eclipse.
ui这个插件, 因为我们使用到了对话框,菜单等等, 这些实现在ui这个插件里都有. 我们
就可以通过add这个按钮加入我
们需要dependency的插件.
而且由于eclipse各个插件版本丰富, 版本之间有时不能兼容, 所以我们有必要对我们要
依赖的插件做一些版本的需求.
我们点中我们依赖的插件的那个项,看页面右边有一个import detail, 可以设置version
to match,你可以填一个你对应
的那个版本. 而且对应规则你也可以自己设定有none, equal, compatible等等, 具体什
么意思可以参看pde guide
另外还有一个选项叫, re-export dependency, 选了这个后, 这样以后你开发的插件被
依赖时, 你设置的这个依赖插件
就可视化了, 挺难表达的,举例:
A --> B , B-->C
如果 A 依赖B ,B 依赖 C, 那A 不一定能依赖C , 除非 B 在依赖C时,同时re-export
dependency, 那A -> C, 就是这个
意思拉
对应的代码段:
runtime page: 这个页是设置运行库的, 默认情况下会有一个和插件同名的一个jar做运
行库, 点击这个默认的jar, 会
看见下面的library content 显示 src/ , 这个设置不会反映在plugin.xml中, 而是在
导出插件时有影响, 对这个更改
后的效果,反应在build.properties中
如果你这个插件有其他依赖的库, 那就要在这里设置, 要不虽然编译通过, 但是实际运
行时还是有问题的
另外运行库也要设置library exporting ,如果你的运行库对别的依赖这个插件的插件不
可视, 那就设置不要导出, 如果
依赖这个插件的插件要用到这个运行库,那就设置导出
对应的代码段:
extension page: 这个是设置插件的扩展, 这是很重要的一部分, 可以通过add来弹出添
加扩展的向导, eclipse中有很
多扩展, 有很多很实用的, 比如helloworld中就用到了actionsets和perspectiveextens
ions这两个扩展点, 以后我们还
会介绍别的扩展
对应的代码段:
point="org.eclipse.ui.actionSets">
label="Sample Action Set"
visible="true"
id="MyPlugin.actionSet">
...
point="org.eclipse.ui.perspectiveExtensions">
targetID="org.eclipse.ui.resourcePerspective">
...
extension point page: 你可以设置自己的扩展点, 让别的插件来扩展. 这部分有的好
介绍了, 以后再说,哈~
source page: 如果你实在熟的不得了, 也可以直接改源代码,呵呵
[运行插件]
PDE 提供了专门的 runtime workbench 供开发者方便的运行测试插件, 而不用部署之后
才能运行. 在菜单 run-> run
..., 然后new 一个 runtime workbench 配置,
arguments页面设置 workspace data , 这个设置运行的workbench的工作区存在哪儿
jres 设置运行这个运行时平台用的jre
program arguments 中可以设置nl,os,ws等参数, 如果想测试国际化插件, 可以在这里
改变nl,来测试
翻到plugin and fragment页: 默认的, 工作区里的所有插件都运行, 如果有的插件你不
想测试, 不想让它运行, 可以选
第三项,然后在出现的选择框中去掉不要的插件.
配置好后, 既可以运行, 也可以测试
如果你运行的测试平台用的jre是1.4以上版本, 就可以进行热替换 , 就是你还代码改变
后,编译出新的class,可以在不
重新启动runtime workbench的情况下, 直接把旧的class替换掉. 推荐使用.
[部署插件]
如果你已经开发好你的plugin, 打算部署你的插件, 那很简单, 菜单 export->
deployable plug-ins and features,
之后选择你要导出的插件, finish 就ok了
不过这个导出功能是有bug的, 它会事先check所有插件的dependency, 如果dependency
有问题就不能导出, 但是有时有
的旧的插件的dependency没有及时更新,导致check时出错, 不能导出, 这个在wsad里面
我碰过好几次, 也很郁闷的. 这
个估计会在3.0里面fix, 现在我们也是无奈之下,自己写了一个ant, 然后用ant导出. 其
实都是一样的
Eclipse零起步(11)
(前言)
PDE除了可以开发plugin, 还可以开发fragment, feature 和 site.
(正文)
[fragment 简介]
fragment不是一个完整的plugin, 而是plugin功能的扩展. 对于一个fragment来说, 它
都有一个对应的plugin, 如果
plugin不安装运行, 那fragment就算装了也不会起作用.
一般来说, fragment 最广泛的应用是 nls (native language support). 基本上你看一
下wsad里面的plugins, 都有一
个对应的一个fragment, 名字是对应的plugin后加.nl1来表示. 这个可以看一下零起步
九, 你可以从中了解更多的关于
plugin 在 i18n (internationalization) 方面的应用.
那下面我们来介绍一下,如何开发一个helloworld的fragment, 来实现helloworld的i18n
应用.
[PDE 开发 fragment]
我们先用PDE新建一个hello world的例子, 详见零起步九, 我们假设这个项目的名字叫
做org.eclipse.example.xyz
然后我们再用pde新建一个fragment, 具体如下:
file->new -> plug-in development -> fragment project
fragment project 的名字叫做 org.eclipse.example.xyz.nls, 按next
然后使用code generation wizard来创建插件, 选default fragment structure, 按nex
t
在simple fragment content的plug-in id 按browse 选或直接键入
org.eclipse.example.xyz,确定我们这个fragment
所扩展的plug-in. 然后finish. 这时, 一个fragment已经生成好了.
hello world中, 大家应该还记得它的作用就是resource透视图中有一个sample
menu->sample action, 点击这个菜单后
会有弹出一个对话框, "hello, eclipse world."
那如果在不同的系统中,我们要让这段提示输出不同语言的helloworld, 比如我想在用中
文系统中显示"你好,eclipse世
界!" 的话, 那可以用fragment来实现. 使你的plug-in成为一个多语言版本的plug-in.
[修改plug-in为符合i18n的代码]
我们打开org.eclipse.example.xyz.actions.SampleAction.java,
=================================================
public void run(IAction action) { MessageDialog.openInformation( window.getShell(), "Xyz Plug-in", "Hello, Eclipse world"); }
=================================================
这段代码是不符合i18n规则的
我们利用jdt的一个功能, menu->source->externalize string
设"Xyz Plug-in"的key为DIALOG_TITLE, "Hello, Eclipse world"的key为DIALOG_CONTE
NT
然后设properties file的name为message.properties, 这样next之后, 这些string就都
抽出来了
我们会发现sampleaction.java的代码变成了
================================================
public void run(IAction action) { MessageDialog.openInformation( window.getShell(), Messages.getString("SampleAction.DIALOG_TITLE"), //$NON-NLS-1$ Messages.getString("SampleAction.DIALOG_CONTENT")); //$NON-NLS-1$ }
================================================
同时, 有多了一个messages.java 和message.properties
messages.java是一个resouce bundle的控制类, 而数据都存在message.properties里面
我们看一下message.properties
SampleAction.DIALOG_TITLE=Xyz Plug-in
SampleAction.DIALOG_CONTENT=Hello, Eclipse world
这里等于将这些需要翻译的字符串都外部化出来了
[编写 fragment]
此时,我们要对fragment的事就很简单了.
在fragment对应的src目录下新建一个包 org.eclipse.example.xyz.actions, 在这个包
下面新建一个message_zh.
properties的文件,然后填入:
SampleAction.DIALOG_TITLE=Xyz /u63d2/u4ef6
SampleAction.DIALOG_CONTENT=/u4f60/u597d,eclipse/u4e16/u754c!
你会发觉我填进去的都是/uxxxx, 你可以利用jdk下面的native2ascii来转换, 详见零起
步九
然后,我们就可以测试我们的plug-in和fragment了
[测试不同语言版本的plug-in]
点击run...-> new workbench configuration
我们可以看见这个配置的arguments这个页面中的program arguments这一项的有四个参
数(window下):
-os win32 -ws win32 -arch x86 -nl zh_CN
-nl这个参数就是用来确定启动的这个测试平台的语言环境的, 如果-nl等于zh_CN(中文)
,那启动后点击菜单按钮, 你就会发现弹出一个标题为"Xyz 插件",内容为"你好,Eclipse
世界!"的对话框
如果你的-nl的值是 en_US, 那出来的结果就是"Hello, Eclipse World"
当然, 如果你想开发其他语言版本的话, 可以新建message_xx.properties, xx代表那个
语言的缩写.
如果你启动的-nl的值是 de_DE(德国), 但你没有对应语言的properties的话, 就会自动
调用默认的message.properties
ok, 今天就讲了fragment和fragment在i18n的实际应用, 大家好好消化吧
Eclipse零起步(12)
(前言)
今天介绍PDE的feature部分, 别以为feature没有实际的代码,运行库, 但是它对管理和
组织整个eclipse插件平台是起着
至关重要的作用的.
(正文)
[feature 简介]
一般来说做一个eclipse的插件有可能需要做很多插件, 可以有助于开发时的模块独立化
,层次化, 有时一个产品的插件
可能有com.company.product.core, com.company.product.ui,
com.company.product.help 等等, 如果你的插件还有段
, 做nls支持的话, 那还会有com.company.product.core.nls,
com.company.product.ui.nls, com.company.product.
help.nls等等. 所以一般来说, 发布出去的eclipse插件产品都会包含好多个plug-in,
运行时缺一不可. 那我们如何来
管理这些plug-ins的运行呢. 就要用feature了
feature其实前面已经介绍过了, 它是一个插件的包络器, 让eclipse能够更加方便快捷
的管理插件. 而我们可以利用
feature做些什么呢
1. 管理插件, 包括插件的启动, 禁用, 就算插件已经在plugins目录下, 也可以控制它
是否启用.
2. about 功能: 对于一个插件来说, 他到底派些什么用处, 如何让user能尽快了解你的
插件功能, 那about可以为你做
到很多, 包括about内的介绍等等, (当然还有eclipse online help, 不过这不是featur
e的功能)
3. 定制welcome page: 当你刚装好一个插件, 如果有welcome page的话, 就会自动弹出
, 这个页面对于newbie来说是很
重要的, 你可以在这个page做一份guide, 让user能更快的使用你的插件
[创建 feature]
上一讲, 我们使用helloworld, 并做了些改进, 还开发了一个fragment作为nls的支持.
那我们今天就要把这个东东用
feature进行打包.
我们的plugin是org.eclipse.example.xyz, 以及fragment :
org.eclipse.example.xyz.nls
此时, 我们先新建一个feature的项目, new-> project->plugin development ->
feature project
项目名: org.eclipse.example.xyz_feature 按next
在feature properties页面, 将feature id 改为 org.eclipse.example.xyz, 按next
注意: feature的id要和一个plugin的id, 否则不能做welcome page, 我也不清楚为什么
, 或许这就是规范, 不知有没有别的方法, 还望大家指教
然后在reference plugin and fragment 页面, 我们勾上我们开发plugin和fragment:or
g.eclipse.example.xyz和org.
eclipse.example.xyz.nls, 按finish
现在,一个简单的feature就创建好了. 如果我们还想对feature做一些更多的设置, 就打
开feature.xml这个文件, 用pde
提供的feature manifest editor来修改
[编辑 feature.xml]
这个editor有overview, information, content, advanced 和source 页面, 使您能更
方便的编辑feature.xml
overview:
这个页面主要分3块 general information, feature urls, supported environment.
general info我们可以修改feature的id, name, version, provider等等, 包括banner
image(在install/update透视图
,单击这个feature,就能在preview视图中看到这个image, 就是商标).
feature url包括这个插件以后要进行升级的url, 因为插件也是可以在线升级的, 我们
会在将到site的时候, 就知道这
里的url该填什么值了.
supported environment表明了这个feature的运行环境, 你可以根据你的运行环境,对这
个选项进行选择, manifest
editor做的很方便, 你只要点"..."按钮, 然后选你要的就可以了
information:
这里主要有3大块info, feature description 就是这个feature功能的简要介绍,
copyright notice, 和license agreement. 这些如果是开发商业级插件,应该都是必填
的东东, 也是为了维护自己的权益嘛
content:
这里就是要修改你这个feature到底要装些什么东东了, 如果是按照前面步骤做下来, 你
可以看见在feature plugins and fragments列表中已经包含了org.eclipse.example.xy
z 和org.eclipse.example.xyz.nls这两个东东了
当然,包含好之后,我们还要做一件事,就是compute required plugins and
fragments, 就是你包络的那些插件要依赖的插件,可以用compute按钮这个功能计算出来
, 当然你也可以手工添加
advanced:
这个页面是让你用来包feature的, 就是说feature不仅可以包络plugin和fragment, 还
可以包络feature, 进行迭代式管理,呵呵, 不过一般用的不多
[about feature 编辑]
编辑feature的about属性,要在feature对应id的那个plugin新建一个about.ini文件, 这
个ini配置文件的内容大致如下:
这里有些配置只有在设立feature的primary等于true的时候,才会有效, #注释中都写清
楚的
===============================================
# about.ini
# contains information about a feature
# java.io.Properties file (ISO 8859-1 with "/" escapes)
# "%key" are externalized strings defined in about.properties
# This file does not need to be translated.
# Property "aboutText" contains blurb for "About" dialog (translated)
aboutText=%blurb
# Property "windowImage" contains path to window icon (16x16)
# needed for primary features only
# Property "featureImage" contains path to feature image (32x32)
featureImage=eclipse32.gif
# Property "aboutImage" contains path to product image (500x330 or 115x164)
# needed for primary features only
# Property "appName" contains name of the application (translated)
# needed for primary features only
# Property "welcomePage" contains path to welcome page (special XML-based
format)
# optional
# Property "welcomePerspective" contains the id of the perspective in which
the
# welcome page is to be opened.
# optional
====================================================
基本的格式如上,大家可以按照这个格式编写自己的feature的about配置文件, 其中有一
项welcomePage的属性, 是用来定义welcomepage的location的.
[welcome page]
我们定义welcomePage=$nl$/welcome.xml, 然后同样在org.eclipse.example.xyz这个插
件下新建一个welcome.xml的文件,我们就可以编写我们自己需要的welcome page了,编写
这个xml也是有规范的, 大家可以去网上查一下welcomepage的dtd 或reference 来指导
大家写, 不过最多的方式,其实还是看例子, 我们比如看pde的welcome page这个例子
我们点击help->welcome, 然后在弹出的对话框中,选择Eclipse Plug-in Development
Environment, 这样pde的welcome page就打开了
然后我们再看看它的源地码来比较一下
===================================================
format="wrap">
This page will help familiarize you with the Eclipse Plug-in
Development Environment. To get started, read the sections below and click
on the related links.
The Plug-in Development Perspective
To do plug-in development open to the Plug-in Development Perspective by
selecting
class="org.eclipse.pde.internal.ui.OpenPDEPerspectiveAction">Window > Open
Perspective > Plug-in Development
.
Create New Plug-ins
To start create a
class="org.eclipse.pde.internal.ui.wizards.project.OpenProjectWizardAction">p
lug-in project
. Choose one of the available templates to create initial content and let
the wizard open the plug-in manifest file. Read the 'Welcome' page and
familiarize yourself with things you can do with the newly created plug-in.
Learn more
To learn more you can browse the
Plug-in Development User
Guide
.
======================================================
作为根节点, 可是设置welcome的标题
对于这份welcomepage的内容做简要介绍
段落分界点
加粗
执行action, 这里的打开plugin-project的向导
用来打开help的相应toc连接
大家可以仿造这些代码来写自己的welcome page
plugin是产品的话, 那feature可以看作是包装盒, 有了一流的产品, 却没有一流的包装
, 销路也不一定会好, 所以大家好好用feature,也是很有必要的
Eclipse零起步(13)
(前言)
今天介绍如何用pde做plug-in install/update site, 使您的插件能够在线安装升级哦.
(正文)
[site 简介]
前几讲我们在讲安装插件的时候, 讲过安装的方式有几种, 包括直接copy, link方式 和
智能安装. 其中智能安装就是
利用eclipse自带的install/update功能来实现插件的安装和升级. 我们做完插件,只需
发布一个安装升级的网址,就一切
ok了.
那这样可以实现自动安装和升级的站点改如何做呢, 其实很简单的, 只要站点内容的配
置符合一定的规范即可.
我们会继续沿用昨天和前天的例子, 把org.eclipse.example.xyz这个插件发布到一个站
点上去.
[利用向导创建update site]
new -> project -> plug-in development -> update site project, 按next
项目名为: org.eclipse.example.xyz_site, 按finish
一个site项目就建好了, 然后我们展开这个项目, 会发现有site.xml文件 , features和
plugins目录, site.xml就是用
来定义站点的具体信息, features和plugins则是用来存放站点所有的features和plugin
s.
[利用manifest editor 来编辑site]
打开site.xml, 有description, build, features, archives 和source等页面
description page:
text是对这个site的一个描述, 当然如何这段描述保存在某个url上,也可以知道url的值
来完成
category是用来分类的, 一般来说一个站点要存多个features时, 那就有必要做个分类.
一般来说, 对于同名feature的
不同版本,我们可以把他放到一个分类中去. 当然也有别的分法, 大家可以各取所好. 添
加分类, 用add按钮添加. 例子
中, 我们需要添加一个Xyz Example分类.
build page:
这个页面很有帮助的, 首先我们在features to build的list中添加我们需要的安置的fe
atures进去, 比如我们例子中的
org.eclipse.example.xyz, 添加进去,然后我们还要选中复选框, 表明我们需要把这个f
eature发布到站点上去, 否则
build的时候会忽略的.
之后先别急着build, 我们来看看别的页面
features page:
我们可以看见我们前面添加的一个features存放的路径, 以及他的properties和它所处
的category, 你可以对这些值做
相应的修改. 同时例子中, 我们需要把org.eclipse.example.xyz这个feature的categor
y设为Xyz example.
archive page:
这块是专门做路径映射的, 具体可以参见platform plug-in developer guide中的站点
映射的参考资料
等以上我们都设置完后,我们就可以进行build了.
翻到build page: 按一下build按钮, ant就会帮助我们自动build好整个site
根据默认设置, 所有的features和plugins都会build到site项目的features和plugins目
录中去
其中有个选项是scrub output folders before the build, 这样在build前, 会先清空
一下输出目录.
[site 结构]
build完成之后,我们就可以展开site项目, 看到site的原貌
+ project/
+ plugins/
- org.eclipse.example.xyz_1.0.0.jar
- org.eclipse.example.xyz.nls_1.0.0.jar
+ features/
- org.eclipse.example.xyz_1.0.0.jar
- site.xml
site.xml的内容
==========================================
id="org.eclipse.example.xyz"
version="1.0.0">
===========================================
其中site里定义了, 一个feature: org.eclipse.example.xyz_1.0.0, 和一个category:
Xyz Example
[测试 site]
如果你以上项目都在本机创建开发, 那就直接切换到install/update 透视图, 在featur
es udpate视图的my computer中
, 搜索到开发站点项目的那个目录.
你会发觉那个项目目录的图标和一般的目录不同, 说明eclipse已经把这个目录看作是ec
lipse的一个update site了. 继
续展开, Xyz Example -> org.eclipse.example.xyz 1.0.0, 点击这个feature, 然后in
stall now.
[发布 site]
发布也就很简单了, 你只要把你的项目里面的site.xml文件, plugins和features目录下
的所有内容, 安置到你的http
server或ftp server上, 别人就可以访问安装升级了