Eclipse插件入门:创建扩展点

在Eclipse RCP应用中利用扩展点机制解藕插件的依赖关系 在Eclipse RCP应用中利用扩展点机制解藕插件的依赖关系 在开发Eclipse RCP应用程序时,我们按照Eclipse插件的思路来组织和划分我们的程序模块,会使系统结构得到很大改善:比如,系统功能的灵活装配,系统的增量开发等。为了达到这种效果,我们要尽量减少插件之间的依赖关系。Eclipse平台中提供的扩展点机制可以用来实现这种目标。 一、业务场景 下面以一个具体的 阅读详情
 

Eclipse插件入门:创建扩展点

如果你对扩展点不陌生,那么在进行这一章节前首先检查一下以前的安装。这里我们采用扩展点基本的知识和如何在它们上面进行迭代;我们将尽量覆盖如何为其它插件提供扩展点。同样,如果你已经学习过OSGI入门(“Getting started with OSGi”),接下来,你可能有对扩展点和OSGi服务之间的不同产生疑问;那么,Neil在EclipseZone上的文章将能解答你的问题。

那么我们开始吧。一个扩展点是两个插件通过数据或编码的交换通讯的钩子。所有的扩展点都定义在XML中;这些都被存储在Extension Registry中并从客户端插件的请求中访问。Eclipse的Extension Registry的一个不错的特性就是能够将先前启动的Bundle作为插件连接起来。Extension Registry也被缓存了起来,所以在你第二次启动Eclipse的时候,它能够比上一次更快启动。

例如,我们将创建一个名为com.example.pizza的插件,定义一个扩展点叫做com.example.pizza,允许其他插件定义新的pizza topping类型,每一个类型都由有一个名字和消费组合。稍后,我们将创建第二个插件提供给第一个。我们将在最后创建基于Hello World模板的插件,这样我们就顺便有了个点击后可以执行一些代码的按钮。

定义一个扩展点我们需要以下两点信息:

¡ 扩展点的标识和名称

¡ 一个指向了一个定义了有效的XML的内容的XML结构

在plugin.xml文件中定义的就像以下内容:

<plugin>

  <extension-point id="com.example.pizza" name="Pizza toppings" schema="schema/com.example.pizza.exsd"/>

</plugin>

我们能在本地或者其它插件中使用已经定义到文件(结合结构定义文件,也可以通过编辑器结构的快照)中的扩展点。pizza元素的内容看起来就像这样:

<extension point="com.example.pizza">

  <pizza cost="1" topping="cheese"/>

</extension>

把它们一起放在一个插件中(见附件com.example.pizza_1.0.0.jar)我们就可以在所有的toppings上迭代并显示它们:

public void run(IAction action) {

StringBuffer buffer = new StringBuffer();

IExtensionRegistry reg = Platform.getExtensionRegistry();

IConfigurationElement[] extensions = reg

.getConfigurationElementsFor("com.example.pizza");

for (int i = 0; i < extensions.length; i++) {

IConfigurationElement element = extensions[i];

buffer.append(element.getAttribute("topping"));

buffer.append(" (");

String cost = "unknown";

if (element.getAttribute("cost") != null) {

cost = element.getAttribute("cost");

} 

buffer.append(cost);

buffer.append("/n");

}

MessageDialog.openInformation(window.getShell(),

"Installed pizza toppings", buffer.toString());

}

不同于插件的在bundle activtor里的启动方法而在一个Action里这样做的理由是:你不能确保这个插件是否处在installed或resolved状态。Bundle或Service的从属在本篇文章的范围之外;但是值得一说,在UI建立起来的时候,所有的已经处于 resolved或started的bundle的扩展点已经被注册了。

所以,我们能够注册我们的扩展点,并且从编码中获得文本数据。关于试图让一些事情变得有用,就像使用实例化一个类?

让我们创建第二个插件,com.example.pizza.ham_1.0.0.jar。我们将创建一个叫做HamTopping的类,并且结合com.example.pizza插件中的ITopping接口。我们可以改变扩展点使用一个硬编码的花费实现这个类并做些动态的事情:

public class HamTopping implements ITopping {

public int getCost() {

return (int)(Math.random()*10);

}

public String toString() {

return "Ham topping";

}

}

现在,当通过装载的pizza topping列表时,代替通过数字查找这个花费,我们将这样解决:

if (element.getAttribute("code") != null) {

cost = element.getAttribute("cost");

} else {

try {

ITopping topping = (ITopping) Class.forName( element.getAttribute("class")).newInstance();

cost = String.valueOf(topping.getCost());

} catch (Exception e) {

cost = e.toString(); // obviously for demo purposes only

}

}

这个原则看起来似乎正确,但是如果你试着运行它,你将得到一个ClassNotFoundException,因为com.example.pizza.ham依赖在com.example.pizza上,没有其它的办法绕过;并且如此的类不可见。(当它在同一个包里的时候可以工作,但是不应该真正的相互依靠)。

那么我们要做什么?好的,这有两点选择:

¡ 使用OSGi的Dynamic-ImportPackage去扩展ClassLoader的范围

¡ 使用Extension Registry的createExecutableExtension()来代替解决

标准的方法是利用Extension Registry。这样做,你需要改变getAttribute()和结合Class.forName().newInstance()方法;这从异常视图部分已经变得略微清晰:

if (element.getAttribute("code") != null) {

cost = element.getAttribute("cost");

} else {

try {

ITopping topping = (ITopping) element.createExecutableExtension("class");

cost = String.valueOf(topping.getCost());

} catch (CoreException e) {

cost = e.toString(); // obviously for demo purposes only

}

}

为了能够正常的PDE,名为class的属性需要额外的信息来修饰它:

<attribute name="class" type="string">

 <annotation>

  <appInfo>

   <meta.attribute kind="java" basedOn="com.example.pizza.ITopping"/>

  </appInfo>

 </annotation>

</attribute>

 

你能通过PDE结构编辑器来编辑这个结构,并为class属性选择java作为类型,并且放置com.example.pizza.ITopping接口让其实现。(Note that you can also base it on a derived class instead of an interface should you desire.)

已更改架构和该插件来调用 createExecutableSchema(),我们可以立即启动我们的 Pizza 窗口以迭代通过所有已安装的 toppings,包括动态 ITopping 类从另一个程序包解决的。 如果您希望浏览、 随意来创建多个插件并将它们插入 Eclipse 运行时,并且您将看到其他 toppings 遍历每次您单击按钮上。 adventurous 间您可能会甚至尝试启动最 Eclipse 运行时使用的控制台,并验证,卸载 toppings 确保它们不再显示。 (请注意它是不足以停止包 ; 扩展是仍然存在甚至当一个包已停止。 包需要被卸载为扩展注册表以忘记有关它)。

但愿这已授予您了解有关如何创建您自己的扩展点和稍微评价的原因 Eclipse 对其 可扩展性的所有使用这种模式。

参考: 

本文原文http://www.eclipsezone.com/eclipse/forums/t97608.rhtml


附录B:创建扩展点的过程

Creating Extension Points 1 - details instructions Eclipse 3.3 

1)File; New; Project; Plug-in Project; Next; 
2)Project name: com.example.pizza; Next; Next; 
3)Templates; Available templates: Hello, World; Finish 
4)DC. MANIFEST.MF; Extension Points; All Extension Points; Add 
5)Extention Point ID: com.example.pizza 
6)Extention Point Name: Pizza toppings 
7)Finish 
8)RC. file com.example.pizza.exsd; Open With; NotePad 
9)Edit; Select All; Edit; Copy 
10)Select in ?Extension Point Schema Editor? Tab: com.example.pizza.exsd 
11)Edit; Select All; Edit; Paste; File; Save 
12)Close Shema - window ? 
13)DC. MANIFEST.MF; Extensions; Add 
14)Extension Point selection; Extention Point; Extension Point filter: com.example.pizza; Finish 
15)in extension pizza: 
topping: cheese 
cost: 1 
16)File; Save 
17)In package: com.example.pizza.actions; class: SampleActions.java; 
method: run( ) change: 

MessageDialog.openInformation(

window.getShell(),

"Hello_World Plug-in",

"Hello, Eclipse world");


with: 

public void run(IAction action) {

StringBuffer buffer = new StringBuffer();

IExtensionRegistry reg = Platform.getExtensionRegistry();

IConfigurationElement[] extensions = 

reg.getConfigurationElementsFor("com.example.pizza");

for (int i = 0; i < extensions.length; i++) {

IConfigurationElement element = extensions[i];

buffer.append(element.getAttribute("topping"));

buffer.append(" (");

String cost = "unknown";

if (element.getAttribute("cost") != null) {

cost = element.getAttribute("cost");

} 

buffer.append(cost);

buffer.append(" )");

buffer.append("/n");

}

MessageDialog.openInformation(window.getShell(), "Installed pizza toppings", buffer.toString());

}


18)RC. Project com.example.pizza; Run as; Eclipse Aplication; 
19)Close runtime Welcome screen; Press button: : Hello, Eclipse world 
20)You will see dialog box: Installed pizza toppings: cheese(1); Yes 

Creating Extension Points 2 - details instructions Eclipse 3.3 
1)Open project com.example.pizza 
2)DC. schema/com.example.pizza.exsd; Open Whit; Extension Point Schema Editor 
3)Select Tab: com.example.pizza.exsd; Mention atribute: 
<attribute name="class" type="string"> 
<annotation> 
<appInfo> 
<meta.attribute kind="java" basedOn="com.example.pizza.ITopping"/> 
</appInfo> 
</annotation> 
</attribute> 

4)Close windowwith Shema: com.example.pizza.exsd 
5Copy: 

package com.example.pizza;

 

public interface ITopping {

public int getCost();

}


6)RC. Project com.example.pizza; Paste 
7)RC. MANIFEST.MF; Open Whith; Plug-in Manifest Editor; Runtime; Exported Packages; Add 
8)Select packages to export: com.example.pizza; OK 
9)File; Save; 
10)Close MANIFEST window (window com.example.pizza) and window Itopping.java 
11)File; New; Project; Plug-in Project; Next; 
12)Project name: com.example.pizza.ham; Next 
13)Generate an activator?.: uncheck; Finish 
14)Copy: 

package com.example.pizza.ham;

 

import com.example.pizza.ITopping;

 

public class HamTopping implements ITopping {

 

public int getCost() {

return 2;

}

public String toString() {

return "Ham topping";

}

}


15)RC. Project com.example.pizza.ham; Paste 
16)DC. MANIFEST.MF; Dependencies; Required Plug-ins; Add 
17)Select a Plug-in: com.example.pizza; OK; File; Save 
18)Select: Extension; Add 
19)Extension Point selection; Extention Point; Extension Point filter: com.example.pizza; Finish 
20)in extension pizza: 
topping: ham 
class: com.example.pizza.ham.HamTopping (Use Browse) 
21)RC. com.example.pizza; New; pizza 
topping: pepperoni 
cost: 1 
22)File; Save; Close MANIFEST window and window HamTopping.java 

23)In project: com.example.pizza; open package: com.example.pizza.actions; class: SampleActions.java; method: run( ) change: 

if (element.getAttribute("cost") != null) {

cost = element.getAttribute("cost");

} 

with:

if (element.getAttribute("class") == null) {

if (element.getAttribute("cost") != null) {

cost = element.getAttribute("cost");

}

} else {

try {

ITopping topping = (ITopping) Class.forName( element.getAttribute("class")).newInstance();

cost = String.valueOf(topping.getCost());

} catch (Exception e) {

cost = e.toString();

}

}


24)Use Source; Organize Imports 
25)RC. Project com.example.pizza; Run as; Eclipse Aplication; 
26)Close Welcome screen; Press button: : Hello, Eclipse world 
27)Dialog box: Installed pizza toppings; Message: ham(java.lang.ClassNotFoundException: com.example.pizza.ham.HamTopping); OK; 
28)Close 'runtime' workbench/Eclipse (oposite to 'host' workbench/Eclipse); OK 
29)In project: com.example.pizza; open package: com.example.pizza.actions; class: SampleActions.java; method: run( ) change: 

ITopping topping = (ITopping) Class.forName( element.getAttribute("class")).newInstance();

with:

ITopping topping = (ITopping) element.createExecutableExtension("class");



30)RC. Project com.example.pizza; Run as; Eclipse Aplication; 
30)Select resources to save; OK 
31)Press button: : Hello, Eclipse world 
32)Dialog box: Installed pizza toppings; Message: 
cheese(1) 
ham(2) 
pepperoni(1) 
OK; 
33)Close 'runtime' workbench/Eclipse; OK 
34)RC. Project com.example.pizza; Export; Deployable plug-ins and fragments; Next 
35)Available plug-ins and fragments: Select All; Destination; Directory: Browse?; Options; Include source code: check; Finish

教你怎样扩展Eclipse的扩展点(一)   现在手头上做的基于Eclipse RCP的上海佳吉快运第三代运营系统的项目也快接近尾声了,经历一个项目从设计开发到马上完成的过程,也从中向同事们学到了很多的东西,所以今天我想将项目中用到的一些技术细节记录下来,也当作是我的学习笔记吧,以后自己也可以看看。    这里要介绍的是关于Eclipse 中扩展点的问题,我们知道,Eclipse本身提供了很多的扩展点,这样的话,我们可以根据需要对Ec 阅读详情

相关推荐

Eclipse plugins 插件开发学习 - 扩展点介绍

Eclipse 存在很多的扩展点:1. org.eclipse.ui.actionSets                  给 Eclipse 增加主菜单和工具栏 (Workbench Window Actions)             implements IWorkbenchWindowActionDelegate             2. org.eclipse.ui.popup

SUB 的专栏 5105

教你怎样扩展Eclipse的扩展点(三)

接下来,我们开始实现 扩展点的一些 功能吧,新增选中的包和类: 为了方便起见,我将这些类的源代码贴出来  TheFirstAction .java:  package org.vwpolo.rcp.extension.client.actions;import org.eclipse.jface.action.Action;/** *  。 * @author 刘绕兴 *

vwpolo的专栏 2793

掌握Eclipse插件开发:创建个性化的扩展点

在Eclipse的插件架构中,扩展点是一种定义了可以被其他插件扩展或实现的特定功能的接口或类。扩展点是Eclipse插件间实现松散耦合的关键技术,允许插件系统中的组件被灵活地扩展或替换。它们为插件开发者提供了一种标准化的方式来贡献或扩展Eclipse平台的功能。扩展点是 Eclipse 插件架构中的核心概念,它允许插件开发者定义一种通用的接口,使得其他插件可以在运行时发现并使用这些接口。通过扩展点,Eclipse 平台提供了一种强大的扩展机制,允许插件之间进行松耦合的交互。

weixin_29443363的博客 1206

Eclipse Plug-in 自定义扩展点(十)

首先申明下,本文为笔者学习《Eclipse插件开发学习笔记》的笔记,并加入笔者自己的理解和归纳总结。 1. 自定义扩展点 在【Extension Points】中添加一个自定义扩展点【userExtensionInfo】。 生成的扩展点一般是包名 + "Extension Poing ID"的值 自定义扩展点包括 Element,节点 Attribute,节点属性 Choice,只能选取其中一个...

假装你是大灰狼的专栏 1857

Eclipse Platform Extension Points(Eclipse 平台扩展点大全)

Platform Extension Points.chm Eclipse 平台扩展点大全

基于Java+Maven+Testng+RestAssured+Allure+Jenkins搭建一个接口自动化框架

2、有一个提取表达式列,通过编写每个接口的JSON提取表达式,后边在解析Excel时,对接口执行后的响应数据用该表达式提取出来,保存到环境变量,如果某些接口需要前置接口的响应数据,我们就可以从环境变量中获取该数据出来,从而解决了接口关联的问题。1、在之前介绍过全局配置类Contants中添加一个控制台日志开关控制权限,如果选择为false,则控制台不输出日志,将日志输出到allure报表,选择为true,则在控制台输出日志,不输出到allure报表。

专注于技术分享的博主 1183

eclipse自定义扩展点

一、组成 一个扩展点(Extension Point)包括ID、Name及Schema文件,shema文件以ID命名,后缀为.exsd,存放在插件schema目录下。   使用eclipse的向导创建扩展点后会自动生成一个extension元素(element),这个元素由三项属性(attribute):point、id、name。可以通过choice和sequence的组合向extensio

2738

卡尔曼滤波与目标追踪

卡尔曼滤波与目标追踪为什么要学卡尔曼滤波?卡尔曼滤波是什么?一些概率论的知识基础卡尔曼滤波完整推导状态估计计算卡尔曼增益预测和更新 卡尔曼滤波部分我打算分三节(三次博客的内容): 卡尔曼滤波与行人状态估计 扩展卡尔曼滤波(EKF)与传感器融合 过程模型,无损卡尔曼滤波(UKF)与车辆状态轨迹 为什么要学卡尔曼滤波? 卡尔曼滤波以及其扩展算法能够应用于目标状态估计,如果这个目标是行人,那么就是行人状态估计(或者说行人追踪),如果这个目标是自身,那么就是车辆自身的追踪(结合一些地图的先验,GPS等数据的话就

qq_43232556的博客 4171

Eclipse插件开发自定义扩展点

介绍 如果你的插件写的有特色,想拿来用,但是还不能或者不适合直接修改你的代码,怎么办呢?解决方案当然是Eclipse插件系统最推荐的了——增加扩展点。 概念 一个扩展点(Extension Point)包括ID、Name及Schema文件,shema文件以ID命名,后缀为.exsd,存放在插件schema目录下。 定义 [codesyntax lang="xml"]

Jenkins中文社区 624

weblogic等保测评操作过程

weblogic网络安全等级测评保护操作

qq_48257021的博客 2757

ArcGIS Enterprise10.9.1的Windows安装部署

ArcGIS Enterprise10.9.1中Windows版本安装介绍。

qq_36250702的博客 2445

自己动手编写Eclipse扩展点

  扩展(Extension)是Eclipse中一个关键的机制,plug-in利用扩展向Eclipse平台添加新功能。但是扩展不能随意地创建,必须按照扩展点(extension point)定义的规范进行明确的声明,Eclipse才能认出这些扩展。我们不仅可以使用Eclipse提供的众多现成的扩展点,而且还可以定义新的扩展点,并在该扩展点上进行扩展。  当然,扩展点的定义比较复杂。不过Eclips

winion的专栏 4181

ABAP Secure Storage 在事务码 SM59 中的应用

系统管理人员在进行维护时,应关注相关日志信息,及时发现可能出现的安全异常,并针对不同安全等级的操作制定相应的备份与恢复策略,以降低潜在风险。该区域在设计上具备高度隔离性,仅允许经过授权的组件访问。保存后,系统会将密码存储在 Secure Storage 中,这种处理方式充分体现了 SAP 标准程序在安全设计上的考量。对于系统管理员而言,这种机制在日常维护与审计中提供了有力的支持,可以通过比对存储数据的哈希值或其他完整性校验手段,及时发现异常变动,保障系统长期稳定运行。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 671

【eclipse插件开发实战】Eclipse插件开发1——eclipse内核结构、扩展点机制

Eclipse插件开发1——eclipse内核、扩展点机制 一、Eclipse内核结构 Eclipse是一个称作插件加载器的小内核,有上百个插件,eclipse最重要的特征就是它的插件架构,其核心非常小,而由许多功能插件组合而成。在启动时,插件加载器扫描plugin.xml文件,寻找每一个插件,并构建一个包含这些信息的架构。 通常eclilpse富客户端程序(RCP,Rich

DianaCody's Blog 5569

Python + Playwright:集成 Applitools 进行视觉回归测试(快速入门)

Applitools是一款基于人工智能的视觉验证测试工具,专门用于自动化和验证应用程序的用户界面(UI);Applitools使用视觉回归测试来检测应用程序界面的变化,确保 UI 在不同版本之间的一致性;Applitools的核心功能是通过视觉比较,检测 UI 元素的差异,而无需手动编写复杂的界面检查代码;通过集成Applitools,测试人员可以轻松捕捉和验证界面中的视觉差异,无论是在Web移动端或桌面应用的测试环境;

blues_C的博客 2920

蓝牙功耗优化实战:连接蓝牙耳机时高耗电问题的深度排查与解决

连接任意一款蓝牙耳机, 进行插入实网SIM卡, 同时连接蓝牙耳机后, 进入IDLE模式, 测试时间为10分钟的测试结果, 平均电流毫安在8左右. 测试结果1: 平均电流 8.84mA 测试结果2: 平均电流 7.39mA 厘清问题: 由于出现上两幅图中 绿色线圈中的 20mA 左右高耗电时段, 从而将整体的平均电流抬高. 于是在记录IDLE下电流出现绿色线圈中的 20mA 左右高耗电时段, 同时录制UART1 Catcher log. Filter: MOD_BT/MOD_ATC.

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 1001

Eclipse插件扩展点清单

介绍 我们都知道Eclipse中有很多的插件,也有很多的扩展点,那在Eclipse平台中到底有哪些扩展点可以让我们来用呢? 这里你不仅能看到有哪些扩展点,还可以看到这些扩展点都应该怎么用,会有对应的例子链接。 Platform runtime org.eclipse.core.contenttype.contentTypes org.eclipse.core.runtime.adapter

Jenkins中文社区 729

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Eclipse插件开发之新手入门

现在在Internet上已经可以见到不少的Eclipse插件开发的入门文章,这里我写本文的目的主要是将我自己的体会和最开始的学习告诉给大家。 同时也希望本文能使用最为简单的方法来让大家了解开发Eclipse插件的基础。需要注意的是,要学习Eclipse的插件开发,你需要: 会使用Eclipse来开发Java应用程序 了解插件这个词的概念 了解一些XML的知识 本文是一个入门的文章,只是

oicqren的专栏 1393

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Eclipse插件开发

基础知识 1.Eclipse的架构 architecture=架构 platform=平台 2.扩展点 代码1-1 plugin.xml中声明扩展 <extension point="被使用扩展点的ID"> ...... </extension> Eclipse平台提供的扩展点有 增加菜单项 增加视图 增加编辑器 工作台和资源访问的API是Eclipse提供的API中最基本的,在插件开发时使用频率较高的API。在这里不做详细的说明,在以后得例子中会出现一些这样的AP

hangge的学习基地 6370

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

eclipse 插件扩展新建java页面_Eclipse插件开发之新手入门

Eclipse插件开发之新手入门更新时间:2006年10月13日 00:00:00 作者:现在在Internet上已经可以见到不少的Eclipse插件开发的入门文章,这里我写本文的目的主要是将我自己的体会和最开始的学习告诉给大家。 同时也希望本文能使用最为简单的方法来让大家了解开发Eclipse插件的基础。需要注意的是,要学习Eclipse的插件开发,你需要:会使用Eclipse来开发Java...

weixin_29982199的博客 512

在Eclipse中如何提供扩展点

      这只是一个很简单的例子,涉及到两个plugins(bundles),其中一个叫provider,提供了一个扩展点,另外一个叫customer,扩展了provider提供的扩展点,以下步骤在Eclipse中进行1、在provider中创建一个ICalculator接口如下:public interface ICalculator {  long add(int a,int

Chinajash的专栏 2558
上一篇: 迷茫的80创业
下一篇: [创业] 让创业者惊讶的19个真相
juneman
博客等级 码龄19年 141粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值