12.4. 发布 OSGi 服务
12.4.1. 概述
本节介绍如何在 OSGi 容器中生成、构建和部署简单的 OSGi 服务。该服务是一个简单的 Hello World Java 类,并且 OSGi 配置是使用 Blueprint 配置文件定义的。
12.4.2. 先决条件
要使用 Maven Quickstart archetype 生成项目,您必须满足以下条件:
- Maven 安装- Maven 是一个来自 Apache 的免费开源构建工具。您可以从 http://maven.apache.org/download.html 下载最新版本(最小为 2.0.9)。
- 互联网连接-whilst 执行构建,Maven 会动态搜索外部存储库,并即时下载所需的工件。要使此任务正常工作,构建 机器必须 连接到互联网。
12.4.3. 生成 Maven 项目
maven-archetype-
Quickstart archetype 创建一个通用 Maven 项目,然后您可以根据您需要的任何用途进行自定义。要使用协调( org.fusesource.example:osgi-service
)生成 Maven 项目,请输入以下命令:
mvn archetype:create -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=org.fusesource.example -DartifactId=osgi-service
此命令的结果是目录 ProjectDir/osgi-service
,包含所生成项目的文件。
请注意 ,不要为您的工件选择一个组 ID,该 ID 与现有产品的组 ID 冲突!这可能会导致项目的软件包和现有产品中的软件包与来自现有产品的软件包之间的冲突(因为组 ID 通常被用作项目 Java 软件包名称的根目录)。
12.4.4. 自定义 POM 文件
您必须自定义 POM 文件才能生成 OSGi 捆绑包,如下所示:
- 按照 第 5.1 节 “生成捆绑包项目” 中描述的 POM 自定义步骤操作。
在 Maven bundle 插件的配置,修改捆绑包指令以导出
org.fusesource.example.service
软件包,如下所示:<project ... > ... <build> ... <plugins> ... <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Bundle-SymbolicName>${pom.groupId}.${pom.artifactId}</Bundle-SymbolicName> <Export-Package>org.fusesource.example.service</Export-Package> </instructions> </configuration> </plugin> </plugins> </build> ... </project>
12.4.5. 编写服务接口
创建 ProjectDir/osgi-service/src/main/java/org/fusesource/example/service
子目录。在这个目录中,使用您首选的文本编辑器创建文件 HelloWorldSvc.java
,并将代码从 例 12.3 “The HelloWorldSvc Interface” 添加到其中。
例 12.3. The HelloWorldSvc Interface
package org.fusesource.example.service; public interface HelloWorldSvc { public void sayHello(); }
12.4.6. 编写服务类
创建 ProjectDir/osgi-service/src/main/java/org/fusesource/example/service/impl
子目录。在这个目录中,使用您首选的文本编辑器创建文件 HelloWorldSvcImpl.java
,然后将代码从 例 12.4 “The HelloWorldSvcImpl Class” 添加到其中。
例 12.4. The HelloWorldSvcImpl Class
package org.fusesource.example.service.impl; import org.fusesource.example.service.HelloWorldSvc; public class HelloWorldSvcImpl implements HelloWorldSvc { public void sayHello() { System.out.println( "Hello World!" ); } }
12.4.7. 编写 Blueprint 文件
Blueprint 配置文件是一个 XML 文件,存储在类路径上的 OSGI-INF/blueprint
目录下。要在项目中添加蓝图文件,首先创建以下子目录:
ProjectDir/osgi-service/src/main/resources ProjectDir/osgi-service/src/main/resources/OSGI-INF ProjectDir/osgi-service/src/main/resources/OSGI-INF/blueprint
其中 src/main/resources
是所有 JAR 资源的标准 Maven 位置。此目录下的资源文件将自动打包在生成的捆绑包 JAR 的 root 范围内。
例 12.5 “用于导出服务的蓝图文件” 显示了一个示例 Blueprint 文件,该文件使用 bean 元素创建 HelloWorldSvc
bean
,然后使用 service 元素将 bean 导出为 OSGi 服务
。
在 ProjectDir/osgi-service/src/main/resources/OSGI-INF/blueprint
目录下,使用您首选的文本编辑器创建文件 config.xml
,并从 例 12.5 “用于导出服务的蓝图文件” 添加 XML 代码。
例 12.5. 用于导出服务的蓝图文件
<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <bean id="hello" class="org.fusesource.example.service.impl.HelloWorldSvcImpl"/> <service ref="hello" interface="org.fusesource.example.service.HelloWorldSvc"/> </blueprint>
12.4.8. 运行服务捆绑包
要安装并运行 osgi-service
项目,请执行以下步骤:
构建项目- 打开命令提示并将目录更改为
ProjectDir/osgi-service
。使用以下命令构建演示:mvn install
如果此命令成功运行,则
ProjectDir/osgi-service/target
目录应包含捆绑包文件osgi-service-1.0-SNAPSHOT.jar
。在 Red Hat Fuse 控制台中安装 并启动 osgi-service 捆绑包,请输入以下命令:
Jkaraf@root()> bundle:install -s file:ProjectDir/osgi-service/target/osgi-service-1.0-SNAPSHOT.jar
其中 ProjectDir 是包含 Maven 项目的目录,而
-s
标志会指示容器立即启动捆绑包。例如,如果您的项目目录是 Windows 机器上的C:\Projects
,则使用以下命令:karaf@root()> bundle:install -s file:C:/Projects/osgi-service/target/osgi-service-1.0-SNAPSHOT.jar
注意在 Windows 机器中,请注意如何对
文件
URL 进行格式化,以了解文件
URL 处理程序所了解的语法详情,请参考 第 15.1 节 “文件 URL 处理程序”。检查该服务是否已创建- 以检查捆绑包是否已成功启动,请输入以下命令:
karaf@root()> bundle:list
在这个列表中的某个位置,您应该会看到
osgi-service
捆绑包的行,例如:[ 236] [Active ] [Created ] [ ] [ 60] osgi-service (1.0.0.SNAPSHOT)