本来上学期就打算研究下OSGI了,博客里也早早地建好了OSGI的分类,可还是因为总总原因拖到了现在。现在上手它,是因为我正在为折腾了一学期的tr-069协议实现demo搞个创新点,于是就想到把这个demo做成OSGI吧。
这次记录的是一个实现OSGI里的Declarative Services的一个“类Helloworld”程序。
首先介绍一下Declarative Services:
Declarative Services 是一个面向服务的组件模型,它制订的目的是更方便地在 OSGi 服务平台上发布、查找、绑定服务,对服务进行动态管理,如监控服务状态以及解决服务之间的复杂的依赖关系等问题。Declarative Services 采用服务组件的延迟加载以及组件生命周期管理的方式来控制对于内存的占用以及启动的快速,很好的解决了传统的 OSGi 服务模型在开发和部署比较复杂应用时内存占用大、启动慢等问题,并且对服务组件的描述采用XML来实现,十分便于用户理解和使用。在 Declarative Services 中,Component 可以是 Service 的提供者和引用者,一个 Component 可以提供 0 至多个 Service,也可以引用 0 至多个 Service,并且采用component 方式封装 Service,方便了对 Service 的复用,从开发者的角度来看,该服务组件模型简化了在 OSGi 服务平台中的编程模型。Declarative Services 规范参考了"Automating Service Dependency Management in a Service-Oriented Component Model"一文的有关概念。而对于component更详细的概念,可以google一下,别人都介绍得很全面了。
下面就切入我的这个小程序吧。
首先在eclipse(我的是3.4的JEE版,安装了在eclipse官方下的equinox插件)里新建一个Plug-in工程,就取名为exporter吧。finish后会自动打开工程的manifest.mf文件,先不管它。新建一个接口:cn.zxy.dstest.Printer,就定义一个public void Print()方法:
package cn.zxy.dstest;
public interface Printer {
public void print();
}
再新建一个类:cn.zxy.ds.MyPrinter,实现刚才定义的接口:
package cn.zxy.ds;
import cn.zxy.dstest.Printer;
public class MyPrinter implements Printer {
@Override
public void print() {
System.out.println("OK, congratulations!");
}
}
现在在工程的根目录下新建一个文件夹:OSGI-INF,在文件夹里新建一个XML文件:myprinter.xml
<?xml version="1.0" encoding="UTF-8"?>
<component name="myprinter">
<implementation class="cn.zxy.ds.MyPrinter" />
<service>
<provide interface="cn.zxy.dstest.Printer" />
</service>
</component>
component的name属性值可以随便取;service元素表示我这个组件提供的服务,即我实现了一个接口的功能;其它部分应该不难理解。
接下来就要修改刚才最先看到的mf文件了。切换到mf文件编辑环境下面的Runtime标签,在Exported Packages部分Add包含了我们的接口的包:cn.zxy.dstest;切换到Build标签Binary Build树中勾选我们自己建的OSGI-INF文件夹;再切换到MANIFEST.MF标签下,在最后一行添加Service-Component: myprinter.xml,注意文件最后要保证有一个空行,否则会报错。最后保存刚才的修改。现在我们提供服务的bundle就算完成了,我们可以在mf文件编辑器下选择Overview标签,点击launch the framwork来测试我们的bundle。在"osgi>"后输入services,看是否包含了我们编写的服务,信息类似:
{cn.zxy.dstest.Printer}={component.name=myprinter, component.id=0, service.id=26}
Registered by bundle: initial@reference:file:../../../home/smartzxy/OSGiTest1/exporter/ [22]
No bundles using service.
接下来就要开始编写服务的调用程序了。于上面类似的步骤新建一个工程importer,只是这次不再建接口了,仅仅新建一个类:cn.zxy.test
package cn.zxy.test;
import cn.zxy.dstest.Printer;
public class MyDS {
public void setPrinter(Printer p) {
this.printer = p;
printer.print();
}
public void unsetPrinter(Printer p) {
if (this.printer == null)
this.printer = null;
else
System.out.println("Unbond Printer!");
}
private Printer printer;
}
同样建一个文件夹,建一个xml文件,这次取名为myds.xml:
<?xml version="1.0" encoding="UTF-8"?>
<component name="myds">
<implementation class="cn.zxy.test.MyDS"/>
<reference name="myprinter"
interface="cn.zxy.dstest.Printer"
bind="setPrinter"
unbind="unsetPrinter"
cardinality="0..1"
policy="dynamic"/>
</component>
和刚才一样相应修改一下mf文件,这次需要Imported Packages里Add我们刚才在上一个工程里导出的包:cn.zxy.dstest,不需要导出包了。相应添加语句并保存:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Importer Plug-in
Bundle-SymbolicName: importer
Bundle-Version: 1.0.0
Bundle-Vendor: smartzxy@gmail.com
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: cn.zxy.dstest
Require-Bundle: org.eclipse.osgi;bundle-version="3.4.2",
org.eclipse.osgi.services;bundle-version="3.1.200"
Service-Component: OSGI-INF/myds.xml
最后就是调试了。此时如果exporter工程没有关闭的话,点击importer工程的mf文件里的launch...链接,会看到
osgi> OK, congratulations!
这说明fw调用成功了。如果停止exporter模块,会看到
osgi> stop 22
Unbond Printer!
(22为exporter模块的编号,在osgi>后输入ss会看到)
如果没有出现上述包括OK...在内的信息,说明新建的importer还不是active状态,则在osgi>后输入start 相应的编号,启动它。
至此,我们的程序算是开发完成了!
分享到:
相关推荐
OSGI(Open Services Gateway Initiative)是一种开放标准,用于创建可模块化的Java应用程序。它提供了一种灵活的框架,使得开发者可以构建、部署和管理模块化组件,这些组件被称为服务或bundle。OSGI的核心理念是将...
OSGI(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许应用程序由一系列可独立更新和替换的模块组成,这些模块称为“bundle”。在本实例中,我们将探讨如何利用OSGI技术来开发Eclipse...
OSGi(Open Services Gateway Initiative)是一种Java模块化系统,它为开发人员提供了一种动态、模块化的运行时环境。在OSGi中,应用程序被分解为称为“bundle”的独立单元,这些bundle可以相互依赖并独立地加载、...
OSGI(Open Services Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序分解为一系列可独立部署、更新和交互的服务。林昊所著的《OSGI实战》与《OSGI进阶》是深入理解OSGI技术的重要参考资料,适合...
OSGI组件编程是一种在Java平台上构建模块化应用程序的方法,它由OSGi联盟制定标准,并被广泛应用于企业级软件开发,尤其是对于需要高度可扩展性和动态性的系统。在本教程中,我们将深入探讨如何使用Eclipse和Equinox...
OSGi规范中文版是一本全面介绍OSGi技术的书籍,它不仅涵盖了OSGi技术的基础知识,还详细介绍了OSGi的内部结构和工作原理,对于想要深入学习和应用OSGi技术的开发者而言,是一本非常有价值的参考书。 ### OSGi规范的...
OSGi(Open Services Gateway Initiative)是一种Java平台上的模块化服务框架,它定义了一种标准,使得开发者能够构建可互操作的、动态的、模块化的软件系统。OSGi的核心概念是基于Java的模块化,它的主要目标是为...
OSGI(Open Services Gateway Initiative)是一种开放标准,用于创建模块化和动态的Java应用程序。它为Java开发人员提供了一个框架,使他们能够构建可热插拔的组件,从而实现更灵活、可扩展和可维护的软件系统。在本...
资源名称:OSGI原理与最佳实践内容简介:国内第一本OSGi图书OSGi国内推广者林昊多年经验的结晶涵盖OSGi从入门到深入的知识体系引领OSGi国内研究和普及本书基于作者多年使用OSGi的经验而编写,涵盖了OSGi从入门到深入...
Spring OSGi是Spring框架与OSGi(Open Service Gateway Initiative)规范相结合的一种技术,它允许在OSGi容器中运行和管理Spring应用。OSGi是一种模块化系统,为Java应用程序提供了动态部署、版本控制和依赖管理的...
OSGi(Open Services Gateway Initiative)学习笔记(一) 在IT领域,OSGi是一种模块化系统和Java服务平台,它提供了一种动态管理软件组件的能力。本文将深入探讨OSGi的基本概念、架构以及如何使用它来构建可扩展和...
利用R-OSGi实现分布式OSGi应用 本文通过介绍传统 OSGi 应用程序及 R-OSGi 的实现方式入手,阐述了 R-OSGi 对于 OSGi 规范的实现方式。然后通过一个简单的功能实现由浅入深地讲述传统 OSGi 和 R-OSGi 上的两种不同...
通过这种方式,我们可以体验到OSGi提供的模块化和动态性,这在大型复杂系统中尤其有用,因为它允许我们独立更新和维护各个模块,而不会影响整个系统的稳定运行。理解并熟练掌握OSGi的概念和技术,对于提升Java开发的...
OSGI(Open Services Gateway Initiative)是一种开放标准,用于创建模块化和可扩展的Java应用程序。它提供了一种灵活的框架,允许开发人员将应用程序分解为独立的模块,这些模块称为服务。OSGI的核心是它的模块系统...
标题中的“tomcat嵌入OSGI容器”是指在Apache Tomcat服务器中集成OSGI(Open Service Gateway Initiative)框架,使得Tomcat能够支持模块化的应用程序部署和管理。OSGI是一种Java平台上的服务导向架构,它允许动态地...
OSGI,全称为Open Service Gateway Initiative,中文名为开放服务网关倡议,是一个为Java平台设计的模块化系统和动态服务框架。它定义了一种标准的模块化体系结构,允许Java应用程序由可独立更新和替换的模块(称为...
《企业OSGi实战》一书是OSGi企业应用的权威指南,它不仅涵盖了OSGi在企业环境中的应用,还提供了Java企业版(Java EE)与OSGi特性的融合方法。本书详细介绍了模块化编程的重要性,以及OSGi如何强化Java的模块化能力...
这个压缩包包含了关于OSGI的重要文档,分别是“OSGi R4核心规范文档”、“OSGi服务文档”以及“OSGi-最佳原理与实践”(王昊编著)。下面将详细介绍这些文档所涵盖的关键知识点。 首先,"OSGi R4核心规范文档"是...
OSGi(Open Services Gateway initiative)是一种Java动态模块化系统规范,其核心思想是将应用分割成一系列的 bundles(模块),每个 bundle 都可以独立地安装、启动、停止、更新,而不会影响到其他 bundles。OSGi ...
网上收集的OSGI资料. 包括: OSGi原理与最佳实践(精选版).pdf OSGI实战和源码.rar osgi进阶.pdf Introduce.OSGi.ppt OSGi.in.action.ppt r4.cmpn.pdf r4.core.pdf r4.enterprise.pdf