原文: http://230996.blog.chinajavaworld.com/entry/3676/0/
欢迎来到“OSGi入门”系列的下个部分。这个部分十分的有趣,因为我们将开始尝试使用Declarative Services。
Declarative Service(或者“DS”)规范是OSGi最新的一个部分,并且它来自于跨越Bundle将服务配置到一起的结果。并非这个任务困难——正如我希望我以前讲课中展示的——它需要相当数量的样板代码。它也要求你对内容的条理很谨慎,也就是说你很容易搬起石头砸自己的脚。
早期试图解决此问题的是一个叫做Service Binder的工具。由 Humberto Cervantes 和 Richard Hall 开发的工具。Service Binder引入了自动化的服务依赖关系管理,允许开发人员可以集中精力编写他们的服务。服务之间的配置通过声明处理,并且声明都写在XML中。
这个Declarative Service规范是从Service Binder进化而来,并且是OSGi的4.0版本的一个标准部分。那么,让我们看看它能做什么。
正如我在课程的上一个部分叙述的,我厌倦了在命令行做任何事情:从这点上,我将使用Eclipse SDK。请记住我所介绍的事实上并不依赖Eclipse。虽然Eclipse对我们有或多或少的帮助,不过没什么黑色魔法,所以我们在这里看到的任何东西在NetBeans、IntelliJ甚至在老旧的vi上都是完全可行的。
第一件事,我们需要下载Declarative Services的Equinox实现。假如你使用当前稳定的Eclipse版本是3.2.2,那就从这里下载。如果你使用不同的版本,你需要从顶层的Equinox下载页找到这个版本,并下载org.eclipse.equinox.ds_x.x.x_xxxxx.jar文件。把下载下来的文件放到你的Eclipse安装目录的plugins下,并重启Eclipse。事实上,如果你已经对Eclipse Plug-in开发有一点点了解,你可以把这个jar文件放入你的目标平台文件夹下。如果你不知道什么是“目标平台”,不用担心,只要把这个jar放到plugins目录下就可以了。
现在,我们将创建一个新的Bundle。做这些事情,我们使用Eclipse中的Plug-in项目向导来创建一个项目:[list=decimal]
从主菜单,选择File->New->Project
选择Plug-in Project并单击下一步
输入项目名称:SimpleExporter
在底部,“This plug-in is targeted to run with”文字下面,选择“an OSGi framework”之后在下拉框中选择“standard”。这一步不是绝对必须的,它只是防止我们使用盒外无效的其他OSGi框架实现的特性。
单击下一步。在向导接下来的页面中,取消选中的“Generate an activator”复选框。单击结束
[/list]
我们现在有个空的Bundle项目,所以我们需要添加一些代码。为了尽可能的简单,我们将提供一个使用了在所有的Java Runtime中都有效的接口:java.lang.Runnable,使用一个顺手的小的Eclipse快捷方式,仅仅从你的浏览器复制下面的代码,然后选择SampleExporter项目中的src文件夹并点击Edit -> Paste。Eclipse将为你创建包和源文件。
1
2
3
4
5
6
7
|
package org.example.ds;
public class SampleRunnable implements Runnable {
public void run() {
System.out.println("Hello from SampleRunnable");
}
}
|
到目前为止我们没有看到任何新东西,但是,接下来会有趣些:我们将创建一个XML文件来声明SampleRunnable为一个服务。在顶级目录下创建一个名为OSGI-INF的文件夹,并复制下面的例子到文件samplerunnable.xml中:
1
2
3
4
5
6
7
|
<?xml version="1.0" encoding="UTF-8"?>
<component name="samplerunnable">
<implementation class="org.example.ds.SampleRunnable"/>
<service>
<provide interface="java.lang.Runnable"/>
</service>
</component>
|
这是我们将看到的DS中简单声明中的一个。它描述了一个提供一个服务到OSGI Service Registry的叫做“samplerunnable”的在java.lang.Runnable下的组件,并且这个组件通过类org.example.ds.SampleRunnable来实现。
最后一步是告诉Declarative Service运行时关于这个XML文件的存在。我们为Bundle做这个事情是通过添加一个字段到MANIFEST.MF文件。因此,在编辑器中打开manifest(试着右键点击这个项目并选择PDE工具 -> Open Manifest),跳到名为“MANIFEST.MF”的标签,这允许我们直接编辑manifest的文本内容。添加下面的一行:
1
|
Service-Component: OSGI-INF/samplerunnable.xml
|
然后保存这个文件。正如在上个部分中说的,manifest的最后一个空行是非常重要的,但是不像以前,如果你忘记了,你将从Eclipse获得一个错误信息。
在走的更远之前,让我们运行Equniox来检查这些工作。在Run菜单中选择“Run…”。对话框打开后,在左边的树形列表中选择“Equniox OSGi Framework”,然后点击New按钮。如果你是一个有经验的Eclipse用户但是没有做过OSGI开发,这个对话框可能看上去有些陌生。第一个标签是Bundles,允许我们选择哪些Bundles将包含在运行配置中,并且是否我们将在启动时便初始化。要获得最小集合,点击Deselect All并仅对以下Bundles做标记
[list=decimal]
SampleExporter(underneath Workspace)
org.eclipse.equniox.ds(underneath Target Platform)
[/list]
这些是我们感兴趣的Bundles,但是它们有些依赖,所以单击Add Required Bundles来添加那些依赖。所以,更好的主意是选中“Validate bundles automatically prior to launching”。最后,点击Run,并稍等片刻,osgi>提示符将出现在Eclipse控制台中。OSGi框架正在运行,并且你可以使用你以前学过的相同的命令与之交互。
那么是否我们的服务被注册了?我么可以通过键入services命令来检查。在服务列表中的某个地方—可能在底部—你将看到如下显示:
1
2
3
|
{java.lang.Runnable}={component.name=samplerunnable, component.id=1, service.id=22}
Registered by bundle: initial@reference:file:..../SampleExporter/ [5]
No bundles using service.
|
是的,它被注册了!并且注意一件重要的事情:它通过我们的Bundle注册的,不是通过Declarative Services Bundle。事实上DS代表了我们的Bundle注册了它。我们将迟些了解它如何做的,但是这节课的目的,足够说明了我们的服务的消费者不需要任何具体的工作,事实上,它们连我们使用Declarative Services也不必知道。如果那些消费者愿意那可以很好的使用Declarative Services,但是它们也能使用简单的OSGi代码。
另外要注意的是在我们的Bundle中,没有具体的OSGi的Java代码。换句话说,我们写了个POJO类,这是Declarative Services的一个主要特性。
这些就够了,我很抱歉,这节课程只是一个小小的基础。下次,我们将看看如何用DS以不同的方式消费服务,这将真正的展示出DS提供的的强大和便利。
分享到:
相关推荐
5. **Blueprint或Declarative Services**:这两种是OSGi中的服务配置方式,Blueprint更接近XML,而Declarative Services使用注解,简化了服务的声明和管理。 6. **远程服务**:OSGi Remote Services允许Bundle之间...
《OSGI入门和整合Spring》则关注OSGI与Spring框架的结合,主要讨论: 1. **Spring与OSGI集成原理**:Spring的bean管理如何与OSGI服务机制相结合,实现更灵活的依赖注入。 2. **Declarative Services(DS)**:利用...
学习OSGI入门和整合Spring,对于开发复杂的企业级应用,或者想要提升系统灵活性和可维护性的开发者来说,是非常有价值的。通过理解OSGI的模块化机制和Spring的依赖注入原理,可以构建出更加高效和可扩展的Java应用。
**Spring OSGi 入门** Spring OSGi 是 Spring 框架与开放服务网关规范(OSGi)的结合,它为基于 Java 的应用程序提供了模块化开发的能力。OSGi 是一个动态的、模块化的运行时环境,使得开发者可以创建可热插拔的...
- **Declarative Services (DS)**:DS 是一种声明式服务配置机制,它允许开发者通过元数据定义服务及其依赖关系,而无需编写额外的代码。 - **Blueprint Container**:Spring OSGi 提供了一个基于 Blueprint 的...
- **Blueprint** 和 **Declarative Services** 是两种常见的Spring OSGi服务配置方式,它们都允许在OSGi中声明性地定义Bean和服务。 3. **Spring OSGi的应用场景** - **动态性**:OSGi环境下的Spring应用能更好地...
- **7.2 OSGI R4规范**:详细解析OSGI R4规范,包括核心框架(Core Framework)、启动级别服务(Start Level Service)、声明式服务(Declarative Services)、配置管理服务(Configuration Admin Service)、事件管理服务...
"Getting Started with OSGi 7 Introducing Declarative Services.doc"引入了声明式服务(Declarative Services,DS),这是OSGi中一种简化服务管理的方法。DS允许开发者通过XML配置文件来声明服务依赖和生命周期...
可能会包括如何创建和打包OSGi Bundle、配置Manifest文件(包含Bundle的元数据)、使用Blueprint或Declarative Services进行服务声明、理解OSGi的生命周期管理以及如何在实际项目中应用OSGi技术。 **OSGi原理与最佳...
这些bundle可以是第三方库、应用程序模块或者系统服务,通过声明式服务(Declarative Services,DS)或 Blueprint等配置机制,来实现服务间的依赖管理和通信。 在提供的压缩包文件名称“Tomcat-OSGi-QuickStart”中...
《OSGi实战》一书由BlueDavy撰写,是一份详尽的OSGi入门与实战指南,适合初学者和有经验的开发者深入了解OSGi框架及其应用。以下是对该书籍核心知识点的总结: ### OSGi简介 OSGi(Open Service Gateway Initiative...
- **Declarative Services**: 声明式服务的原理及其与编程式服务的区别。 - **Configuration Admin Service**: 配置管理服务的使用方法和案例。 - **Event Admin Service**: 事件管理服务的功能和实现机制。 - **...
- **使用Declarative Services (DS)管理服务** - **OSGi的事件机制** - **使用DS处理事件** - **OSGi与Spring框架的整合** - **OSGi与Hibernate框架的整合** - **服务的属性和过滤器** #### 三、注册和导出服务 ##...
本教程旨在通过开源的 Knopflerfish OSGi 框架向您介绍 OSGi 编程的基础。选择 Knopflerfish 的原因是它易于安装,并且提供了强大的桌面图形用户界面,这将帮助您快速部署第一个 OSGi 组件(bundle)。 在本教程的...