搜索

12.4. 发布 OSGi 服务

download PDF

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 捆绑包,如下所示:

  1. 按照 第 5.1 节 “生成捆绑包项目” 中描述的 POM 自定义步骤操作。
  2. 在 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 项目,请执行以下步骤:

  1. 构建项目- 打开命令提示并将目录更改为 ProjectDir/osgi-service。使用以下命令构建演示:

    mvn install

    如果此命令成功运行,则 ProjectDir/osgi-service/target 目录应包含捆绑包文件 osgi-service-1.0-SNAPSHOT.jar

  2. 在 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 处理程序”

  3. 检查该服务是否已创建- 以检查捆绑包是否已成功启动,请输入以下命令:

    karaf@root()> bundle:list

    在这个列表中的某个位置,您应该会看到 osgi-service 捆绑包的行,例如:

    [ 236] [Active     ] [Created     ] [       ] [   60] osgi-service (1.0.0.SNAPSHOT)
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.