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

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

  1. 构建项目-open a command prompt,并将目录改为 ProjectDir/osgi-service。输入以下命令来使用 Maven 构建演示:

    mvn install

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

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

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

    karaf@root()> bundle:list

    在此列表中,您应该会看到 osgi-service 捆绑包的行,例如:

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

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.