`
德安德鲁
  • 浏览: 45011 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

OSGI-Eclipse 扩展点,扩展机制

    博客分类:
  • OSGI
阅读更多

Eclipse的组件架构师基于插件的,这就意味着将一组代码组件化为一个单一的组件,然后利用Eclipse框架注册为组件之一,其他组件可以绑定该组件或者调用该组件。

扩展点是插件允许其他插件向公开扩展点的插件提供附加功能的方法。

   

插件(Plug-in):

 

Eclipse功能实现的最小单位,包含了Java代码或者其他文件。插件位于plugins目录下,使用清单文件plugin.xml向系统说明如何继承到平台中。

  

扩展点(Extension point):

 本插件为其他插件提供的接口,插件可以自定义扩展点,也可以实现其他插件的扩展点。

 

 扩展(Extension):

 

对其他插件公开的扩展点进行的实现。

 

 Eclipse扩展机制实践:

 以下代码均在文章:http://489291468.iteye.com/blog/1887290 描述工程的基础实践。

 整个工程目录:


 

 PluginMgrCenter Bundle:

创建ExtensionMgr.java文件:

 

/**
 * 
 */
package extensionservice;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;

import sayhello.ISayHello;

/**
 * @author Administrator
 * 
 */
public class ExtensionMgr
{
	private static final String MY_EXTENSION_POINT_ID = "PluginMgrCenter.sayHello";
	
	private static ExtensionMgr extensionMgr = new ExtensionMgr();
	
	public static final ExtensionMgr getExtensionMgr()
	{
		return extensionMgr;
	}
	
	private boolean flag = false;
	
	public void execute()
	{
		if (!flag)
		{
			try
			{
				Thread.sleep(10000);
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
			
			IExtensionRegistry registry = Platform.getExtensionRegistry();
			evaluate(registry);
			flag = true;
		}
		
	}
	
	private void evaluate(IExtensionRegistry registry)
	{
		
		IConfigurationElement[] config = registry
				.getConfigurationElementsFor(MY_EXTENSION_POINT_ID);
		for (IConfigurationElement e : config)
		{
			try
			{
				System.out.println("bundle : " + e.getNamespaceIdentifier());
				String[] attributes = e.getAttributeNames();
				for (String string : attributes)
				{
					System.out.println("attribute:" + string + ",value is : "
							+ e.getAttribute(string));
				}
				
				final Object o = e.createExecutableExtension("ISay");
				if (o instanceof ISayHello)
				{
					((ISayHello) o).sayHello();
				}
			}
			catch (CoreException ex)
			{
				System.out.println(ex.getMessage());
			}
		}
		
	}
}

 修改PluginMgrCenter Bundle中Activator.java类中的start()方法,注释掉自动发现加载jar包的代码,添加新起线程查询扩展的代码:

 

public void start(BundleContext context) throws Exception
	{
		bundleContext = context;
		try
		{
			System.out
					.println("Start to manage Extensin Point (PluginMgrCenter.sayHello)");
			/*
			 * DirectWatcherTask directWatcherTask = new DirectWatcherTask(
			 * bundleContext, "d:\\plugin\\");
			 * ScheduleTimerPool.getInstance().schedule(directWatcherTask,
			 * 10000, 10000);
			 */
			Thread thread = new Thread(new Runnable()
			{
				@Override
				public void run()
				{
					ExtensionMgr.getExtensionMgr().execute();
				}
			});
			thread.start();
			
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		
	}

 

新建ISayHello.java类,作为扩展点的接口类。

 

package sayhello;

public interface ISayHello
{
	public void sayHello();
	
}

 再新建一个抽象类SayUtil.java

package sayhello;

public abstract class SayUtil
{
	public abstract void selfIntroduce();
	
}

 接下来PluginMgrCenter Bundle创建扩展点,创建结果:

点击“sayHello”扩展点,进入plugin.xml编辑界面,定义扩展点相关元素以及属性。

结果如下:


 sayHello.exsd内如容下:

 

<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="PluginMgrCenter" xmlns="http://www.w3.org/2001/XMLSchema">
<annotation>
      <appinfo>
         <meta.schema plugin="PluginMgrCenter" id="sayHello" name="sayHelloService"/>
      </appinfo>
      <documentation>
         Say hello after self introduce
      </documentation>
   </annotation>

   <element name="extension">
      <annotation>
         <appinfo>
            <meta.element />
         </appinfo>
      </annotation>
      <complexType>
         <choice minOccurs="1" maxOccurs="unbounded">
            <element ref="say"/>
         </choice>
         <attribute name="point" type="string" use="required">
            <annotation>
               <documentation>
                  
               </documentation>
            </annotation>
         </attribute>
         <attribute name="id" type="string">
            <annotation>
               <documentation>
                  
               </documentation>
            </annotation>
         </attribute>
         <attribute name="name" type="string">
            <annotation>
               <documentation>
                  
               </documentation>
               <appinfo>
                  <meta.attribute translatable="true"/>
               </appinfo>
            </annotation>
         </attribute>
      </complexType>
   </element>

   <element name="say">
      <complexType>
         <attribute name="ISay" type="string" use="required">
            <annotation>
               <documentation>
                  
               </documentation>
               <appinfo>
                  <meta.attribute kind="java" basedOn="sayhello.SayUtil:sayhello.ISayHello"/>
               </appinfo>
            </annotation>
         </attribute>
         <attribute name="name" type="string" use="required">
            <annotation>
               <documentation>
                  
               </documentation>
            </annotation>
         </attribute>
         <attribute name="id" type="string">
            <annotation>
               <documentation>
                  
               </documentation>
            </annotation>
         </attribute>
         <attribute name="resource" type="string">
            <annotation>
               <documentation>
                  
               </documentation>
               <appinfo>
                  <meta.attribute kind="resource"/>
               </appinfo>
            </annotation>
         </attribute>
      </complexType>
   </element>

   <annotation>
      <appinfo>
         <meta.section type="since"/>
      </appinfo>
      <documentation>
         [Enter the first release in which this extension point appears.]
      </documentation>
   </annotation>

   <annotation>
      <appinfo>
         <meta.section type="examples"/>
      </appinfo>
      <documentation>
         [Enter extension point usage example here.]
      </documentation>
   </annotation>

   <annotation>
      <appinfo>
         <meta.section type="apiinfo"/>
      </appinfo>
      <documentation>
         [Enter API information here.]
      </documentation>
   </annotation>

   <annotation>
      <appinfo>
         <meta.section type="implementation"/>
      </appinfo>
      <documentation>
         [Enter information about supplied implementation of this extension point.]
      </documentation>
   </annotation>


</schema>

 

plugin.xml如下:

 

<plugin>
   <extension-point id="sayHello" name="sayHelloService" schema="schema/sayHello.exsd"/></plugin>

 

这样公开扩展点的Bundle实现完成。

 

接下来搞两个Bundle 来实现PluginMgrCenter Bundle中定义的扩展点。

 

 

PluginAgent0:

首先看PluginAgent0 Bundle:

 

 


/resouce/NewFile.xml:随便对应一个一个xml文件。用以实现扩展点中的扩展元素“resource”

SayHelloImpl.java:继承ISay接口,泳衣实现扩展点中的扩展元素“ISay”

SayHelloImpl.java代码如下:

 

/**
 * 
 */
package extension0;

import sayhello.ISayHello;
import sayhello.SayUtil;

/**
 * @author Administrator
 * 
 */
public class SayHelloImpl extends SayUtil implements ISayHello
{
	
	@Override
	public void sayHello()
	{
		System.out.println("hi,i am agent0,Hello!");
	}
	
	@Override
	public void selfIntroduce()
	{
		System.out.println("I am Agent1!");
	}
	
}

 

接下来要定义扩展了:
在MANIFEST.MF文件extension标签页中,点击"Add",添加扩展。

 

 

在弹出的扩展点对话框中"Extension point filter"的文本框中输入"*sayHello"查找到PluginMgrCenter中定义的扩展点:PluginMgrCenter.sayHello,选中后,点击"Finish"

而后在"All Extensions"框内右键"PluginMgrCenter.sayHello",选择"New"->"say"

在右侧“Extension Element Details”中填入各个扩展元素的值.

其中:ISay*,表示实现ISay接口的实现类

name*,表示name字符串的值

id*,表示id字符串的值

resource,表示扩展点定义的资源文件。

 

 

 PluginAgent1:



 SayHelloImpl.java 实现ISay接口。用以扩展PluginMgrCenter Bundle中定义的扩展点中的“ISay”元素

/**
 * 
 */
package extension1;

import sayhello.ISayHello;
import sayhello.SayUtil;

/**
 * @author Administrator
 * 
 */
public class SayHelloImpl extends SayUtil implements ISayHello
{
	
	@Override
	public void sayHello()
	{
		System.out.println("hi,i am agent1,hello!");
		
	}
	
	@Override
	public void selfIntroduce()
	{
		// TODO Auto-generated method stub
		
	}
	
}

 MANIFEST.MF中扩展定义如下:

 

验证:

设置PluginAgent1和PluginAgent0 这两个Bundle 默认不启动。
启动工程后,立即执行ss命令,明确PluginAgent0和PluginAgent1这两个Bundle未启动,如下图:

 

待启动后10s,PluginMgrCenter bundle扫描实现本Bundle扩展点的扩展。并打印出扩展Bundle中扩展元素的值,如下图,其中红色框起来的为PluginAgent1和PluginAgent0中实现扩展点扩展元素“ISay”接口的实现类中sayHello()方法的调用。

 

再次执行ss,发现PluginAgent1和PluginAgent0 Bundle已经启动。 

  

 

 

 

 

 

  • 大小: 42.9 KB
  • 大小: 39.8 KB
  • 大小: 25.5 KB
  • 大小: 14.7 KB
  • 大小: 37.8 KB
  • 大小: 25 KB
  • 大小: 19.9 KB
  • 大小: 9.2 KB
  • 大小: 6.5 KB
  • 大小: 16.2 KB
分享到:
评论
2 楼 德安德鲁 2013-07-22  
牛人云小白 写道
楼主大神级别的教程令无数众人顶礼膜拜。楼主能给份工作不?

---
拍马屁,走开
1 楼 牛人云小白 2013-07-20  
楼主大神级别的教程令无数众人顶礼膜拜。楼主能给份工作不?

相关推荐

    org.eclipse.osgi-3.7.0

    【描述】描述中的"org.eclipse.osgi-3.7.0"同样指代了Eclipse OSGi的核心实现库,它包含了运行时环境、服务和工具,使得开发者可以利用OSGi规范构建和部署可扩展的、动态的Java应用。 【标签】"eclipse osgi" 暗示...

    org.eclipse.osgi-3.8.1

    Eclipse OSGi在Eclipse IDE中的应用体现在插件系统上,每个Eclipse插件本质上就是一个OSGi Bundle,它们可以独立开发、部署,并根据需要启动或关闭,极大地增强了Eclipse的可扩展性和可维护性。 总之,"org.eclipse...

    org.eclipse.osgi-3.8.0

    通过 "org.eclipse.osgi-3.8.0.v20120529-1548.jar" 这个 JAR 文件,开发者可以集成这个特定版本的 Eclipse OSGi 框架到他们的项目中,利用其模块化和动态性的优势来构建更加灵活和可扩展的应用程序。

    OSGI 实例eclipse插件开发

    OSGI(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许...同时,掌握OSGI的生命周期管理和服务发现机制,以及Spring在OSGI环境下的工作原理,对于构建灵活、可扩展的Eclipse插件至关重要。

    osgi 扩展点实例

    1. **Eclipse扩展点定义**:Eclipse中的扩展点通常由XML文件定义,包含ID、名称、描述等信息,以及插件可以提供的服务或组件的详细规格。 2. **Eclipse插件实现**:开发者在自己的插件中通过实现指定的扩展点,声明...

    spring-dm-osgi整合jar包

    4. **注册服务**:使用Spring DM的扩展点,将服务bean注册到OSGi服务注册表中。 5. **消费服务**:其他bundle可以通过OSGi服务注册表查找并依赖这些服务。 通过这种方式,Spring DM提供了一种声明式的方法来管理...

    activiti-eclipse插件.rar

    2. **Eclipse插件机制**: Eclipse作为一个开放源代码的IDE,其扩展性极强,通过插件可以增加各种功能。Eclipse插件是基于OSGi(Open Service Gateway Initiative)框架的,每个插件都是一个独立的模块,可以单独安装...

    hadoop2x-eclipse-plugin-original

    2. **Eclipse插件**:Eclipse插件是一种扩展Eclipse IDE功能的方式,它们通过OSGI(Open Services Gateway Initiative)框架实现。Hadoop-Eclipse插件允许用户在Eclipse内直接管理Hadoop集群,创建和运行MapReduce...

    OSGI-in action

    通过注册持久化类为扩展点,完成与Hibernate的集成。 2. OSGI应用的特点 - 动态性:OSGI允许在运行时安装、更新和卸载模块,无需重启整个系统。 - 分离性:每个模块(bundle)都有自己的类加载器,保证了模块间的...

    osgi-jetty-9.3.10环境配置-注册Servlet工程示例

    这通常意味着我们需要找到支持OSGi的Jetty 9.3.10的bundle,例如`org.eclipse.jetty.osgi.boot`,并将其导入到OSGi环境中。 接下来,创建一个简单的Servlet。在Java中,我们需要继承`javax.servlet....

    OSGI-ROOT.rar

    8. **开发工具**:Eclipse IDE集成有对OSGi的支持,使得开发者可以方便地创建、管理和调试OSGi bundle。 9. **应用领域**:OSGi常用于嵌入式系统、大型企业级应用、中间件和服务器端开发,例如在Java EE服务器如IBM...

    整合eclipse扩展点

    "整合eclipse扩展点"这个主题深入探讨了如何利用Eclipse的插件机制,通过 SWT(Standard Widget Toolkit)和 RCP(Rich Client Platform)来构建自定义功能。SWT是Eclipse用于创建图形用户界面的库,而RCP则是基于...

    OSGI.rar_OSGI eclipse_eclipse osgi_java OSGI_osgi

    1. **OSGI基础**:OSGI的核心概念,如服务、模块(Bundle)、类加载器以及它们如何协同工作来构建可扩展和可维护的系统。 2. **OSGI架构**:OSGI框架的组成部分,如框架、服务注册表、生命周期管理(启动、停止、...

    Eclipse平台扩展点清单

    ### Eclipse 平台扩展点清单知识点详解 #### 一、概述 Eclipse 是一款非常流行的开源集成开发环境(IDE),支持多种编程语言,尤其是 Java 的开发。为了满足不同开发者的需求,Eclipse 提供了大量的可扩展性机制。...

    javawebservice源码-osgi-in-action:从code.google.com/p/osgi-in-action自动导出

    Java Web服务(WebService)是...通过研究“osgi-in-action-master”中的源代码,你可以深入了解如何在OSGi环境中有效地开发、管理和部署Java Web服务,这对于理解和实践模块化、可扩展的Java应用程序开发非常有价值。

    blueprint-osgi-bundle:OSGi 示例

    1. **OSGi框架**:OSGi是一种模块化系统,允许Java应用程序按需动态地安装、卸载和升级模块,提供了服务注册和服务发现机制,增强了软件的可维护性和可扩展性。 2. **Blueprint服务容器**:Apache Felix Blueprint...

    course-sys-int-osgi-seminar

    在这样的课程或实验室环境中,参与者可能会学习如何编写和配置OSGi bundle,理解其内部机制,以及如何利用OSGi进行服务注册和服务消费。 在这个过程中,可能会涉及以下知识点: - OSGi的体系结构和组件 - Bundle的...

    基于Java的实例源码-Eclipse的HTML格式化插件 Eclipse Tidy.zip

    5. **Eclipse插件体系**:Eclipse采用OSGi框架,允许插件以模块化的方式进行开发。每个插件包含一个或多个“特性”(features),这些特性定义了插件的功能和依赖关系。在本例中,“features”目录可能包含了Eclipse...

    OSGI中Hibernate扩展在felix中的应用

    9. **JPA支持**:如果使用JPA(Java Persistence API),需要确保JPA提供者如EclipseLink或OpenJPA也已经适配为OSGI bundle。 10. **Testing and Debugging**:在OSGI环境中测试和调试可能比传统Java应用复杂,需要...

    OSGi-in-Practice:Neil Bertlett 来自 OSGi in Practice 的演练示例

    8. **工具支持**:Eclipse、Apache Felix、Apache Karaf等工具提供了对OSGi的支持,简化了开发和管理过程。 9. **应用场景**:OSGi广泛应用于嵌入式系统、服务器应用程序、企业级Java应用以及复杂的桌面应用中。 ...

Global site tag (gtag.js) - Google Analytics