12.5. 访问 OSGi 服务
12.5.1. 概述
本节介绍如何在 OSGi 容器中生成、构建和部署简单的 OSGi 客户端。客户端在 OSGi 注册表中找到简单的 Hello World 服务,并在其上调用 sayHello ()
方法。
12.5.2. 先决条件
要使用 Maven Quickstart archetype 生成项目,您必须满足以下先决条件:
- Maven 安装- Maven 是 Apache 的免费开源构建工具。您可以从 http://maven.apache.org/download.html 下载最新版本(最小为 2.0.9)。
- 互联网连接- 执行构建,Maven 会动态搜索外部存储库,并即时下载所需的工件。为了正常工作,您的构建机器 必须 连接到互联网。
12.5.3. 生成 Maven 项目
maven-archetype-quickstart
archetype 创建一个通用 Maven 项目,然后您可以针对您想要的任何目的进行自定义。要使用协调( org.fusesource.example:osgi-client
)生成 Maven 项目,请输入以下命令:
mvn archetype:create -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=org.fusesource.example -DartifactId=osgi-client
此命令的结果是一个目录 ProjectDir/osgi-client
,包含所生成的项目的文件。
请注意 ,不要为您的工件选择一个组 ID,这些工件与现有产品的组 ID 冲突!这可能会导致项目的软件包和现有产品中的软件包之间冲突(因为组 ID 通常用作项目 Java 软件包名称的根目录)。
12.5.4. 自定义 POM 文件
您必须自定义 POM 文件来生成 OSGi 捆绑包,如下所示:
- 按照 第 5.1 节 “生成捆绑包项目” 中描述的 POM 自定义步骤操作。
由于客户端使用
HelloWorldSvc
Java 接口,它在osgi-service
捆绑包中定义,因此必须对osgi-service
捆绑包添加 Maven 依赖项。假设 Maven 协调osgi-service
捆绑包是org.fusesource.example:osgi-service:1.0-SNAPSHOT
,您应该将以下依赖项添加到客户端的 POM 文件中:<project ... > ... <dependencies> ... <dependency> <groupId>org.fusesource.example</groupId> <artifactId>osgi-service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> ... </project>
12.5.5. 编写蓝图文件
要在客户端项目中添加 Blueprint 文件,首先创建以下子目录:
ProjectDir/osgi-client/src/main/resources ProjectDir/osgi-client/src/main/resources/OSGI-INF ProjectDir/osgi-client/src/main/resources/OSGI-INF/blueprint
在 ProjectDir/osgi-client/src/main/resources/OSGI-INF/blueprint
目录下,使用您首选的文本编辑器创建文件 config.xml
,并添加来自 例 12.6 “用于导入服务的蓝图文件” 的 XML 代码。
例 12.6. 用于导入服务的蓝图文件
<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <reference id="helloWorld" interface="org.fusesource.example.service.HelloWorldSvc"/> <bean id="client" class="org.fusesource.example.client.Client" init-method="init"> <property name="helloWorldSvc" ref="helloWorld"/> </bean> </blueprint>
其中 reference
元素会创建一个参考管理器,它在 OSGi 注册表中找到 HelloWorldSvc
类型的服务。bean
元素创建 Client
类的实例,注入作为 bean 属性 helloWorldSvc
的服务引用。此外,init-method
属性指定在 bean 初始化阶段调用 Client.init ()
方法(即,服务引用注入客户端 bean 后 )。
12.5.6. 编写客户端类
在 ProjectDir/osgi-client/src/main/java/org/fusesource/example/client
目录下,使用您首选的文本编辑器创建文件 Client.java
,并添加来自 例 12.7 “客户端类” 的 Java 代码。
例 12.7. 客户端类
package org.fusesource.example.client; import org.fusesource.example.service.HelloWorldSvc; public class Client { HelloWorldSvc helloWorldSvc; // Bean properties public HelloWorldSvc getHelloWorldSvc() { return helloWorldSvc; } public void setHelloWorldSvc(HelloWorldSvc helloWorldSvc) { this.helloWorldSvc = helloWorldSvc; } public void init() { System.out.println("OSGi client started."); if (helloWorldSvc != null) { System.out.println("Calling sayHello()"); helloWorldSvc.sayHello(); // Invoke the OSGi service! } } }
Client
类定义 getter 和 setter 方法,用于 helloWorldSvc
bean 属性,它允许它通过注入来接收对 Hello World 服务的引用。init ()
方法在 bean 初始化阶段调用,在属性注入后调用,这意味着通常在此方法范围内调用 Hello World 服务。
12.5.7. 运行客户端捆绑包
要安装并运行 osgi-client
项目,请执行以下步骤:
构建项目-open a command prompt,并将目录改为
ProjectDir/osgi-client
。输入以下命令来使用 Maven 构建演示:mvn install
如果这个命令成功运行,
ProjectDir/osgi-client/target
目录应包含捆绑包文件osgi-client-1.0-SNAPSHOT.jar
。在 Red Hat Fuse 控制台中安装并启动 osgi-service 捆绑包-at,输入以下命令:
karaf@root()> bundle:install -s file:ProjectDir/osgi-client/target/osgi-client-1.0-SNAPSHOT.jar
其中 ProjectDir 是包含 Maven 项目和
-s
标志的目录,则 -s 标志可指示容器立即启动捆绑包。例如,如果您的项目目录在 Windows 机器上是C:\Projects
,您可以输入以下命令:karaf@root()> bundle:install -s file:C:/Projects/osgi-client/target/osgi-client-1.0-SNAPSHOT.jar
注意在 Windows 机器中,注意如何格式化
文件
URL - 有关文件
URL 处理程序理解的语法的详情,请参阅 第 14.1 节 “文件 URL 处理程序”。客户端输出-f 客户端捆绑包成功启动,您应该在控制台中立即看到类似如下的输出:
Bundle ID: 239 OSGi client started. Calling sayHello() Hello World!