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)。
- 互联网连接- 执行构建,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 通常用作项目 Java 软件包名称的根目录)。
12.4.4. 自定义 POM 文件
您必须自定义 POM 文件来生成 OSGi 捆绑包,如下所示:
- 按照 第 5.1 节 “生成捆绑包项目” 中描述的 POM 自定义步骤操作。
在 Maven 捆绑包插件配置中,修改捆绑包指令以导出
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 “HelloWorldSvcImpl 类” 添加到该文件中。
例 12.4. HelloWorldSvcImpl 类
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 配置文件是在类路径上的 OSGI-INF/blueprint
目录下存储的 XML 文件。要在项目中添加 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 的根目录范围内。
例 12.5 “用于导出服务的蓝图文件” 显示一个示例 Blueprint 文件,它会创建一个 HelloWorldSvc
bean,使用 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
项目,请执行以下步骤:
构建项目-open a command prompt,并将目录改为
ProjectDir/osgi-service
。输入以下命令来使用 Maven 构建演示:mvn install
如果这个命令成功运行,
ProjectDir/osgi-service/target
目录应包含捆绑包文件osgi-service-1.0-SNAPSHOT.jar
。在 Red Hat Fuse 控制台中安装并启动 osgi-service 捆绑包-at,输入以下命令:
Jkaraf@root()> bundle:install -s file:ProjectDir/osgi-service/target/osgi-service-1.0-SNAPSHOT.jar
其中 ProjectDir 是包含 Maven 项目和
-s
标志的目录,则 -s 标志可指示容器立即启动捆绑包。例如,如果您的项目目录在 Windows 机器上是C:\Projects
,您可以输入以下命令:karaf@root()> bundle:install -s file:C:/Projects/osgi-service/target/osgi-service-1.0-SNAPSHOT.jar
注意在 Windows 机器中,注意如何格式化
文件
URL - 有关文件
URL 处理程序理解的语法的详情,请参阅 第 14.1 节 “文件 URL 处理程序”。检查该服务是否已创建- 检查捆绑包是否已成功启动,输入以下 Red Hat Fuse console 命令:
karaf@root()> bundle:list
在此列表中,您应该会看到
osgi-service
捆绑包的行,例如:[ 236] [Active ] [Created ] [ ] [ 60] osgi-service (1.0.0.SNAPSHOT)