创建服务捆绑软件

对于简单的 HelloWorld OSGi 应用程序,服务捆绑软件实现 HelloWorldEBA 接口并将其作为 OSGi 服务导出。

有关此任务

捆绑软件(OSGi 模型中的模块化单元)是包含 OSGi 应用程序元数据的 JAR 文件。 此元数据在 JAR 文件 META-INF/MANIFEST.MF的清单文件中定义。

Rational® Application Developer Version 8.5 为创建和打包捆绑软件提供图形支持。 下面的样本过程使用此工具。 您也可以使用其他工具,并且这些步骤可以适应其他工具。

此样本过程构建以下两个捆绑软件。
  • com.ibm.ws.eba.helloWorld.api:此捆绑软件声明 HelloWorldEBA 接口。
  • com.ibm.ws.eba.helloWorld.service:此捆绑软件实现 HelloWorldEBA 接口并将其作为 OSGi 服务导出。 导出的服务由客户机捆绑软件 com.ibm.ws.eba.helloWorld.client使用,如 创建客户机捆绑软件中所述。

此任务的演示 (9 分钟) Flash 演示图标

过程

要创建服务捆绑软件,请完成下列步骤:

  1. 创建 com.ibm.ws.eba.helloWorld.api 捆绑软件。 此捆绑软件声明 HelloWorldEBA 接口。
    1. 单击 文件 > 新建 > OSGi 捆绑软件项目
      将显示 " OSGi 捆绑软件项目 " 面板。
    2. 配置项目。
      • 对于项目名称,输入 com.ibm.ws.eba.helloWorld.api
      • 清除 将捆绑软件添加到应用程序 复选框。 如果保留选中此复选框,那么将自动创建一个新 OSGi 应用程序项目,并会将捆绑软件添加到该项目。 但是,将在单独的任务 创建 OSGi 应用程序中手动创建应用程序项目。
      • 让其他选项保留为缺省值。
    3. 单击 下一步
      将显示 " Java 配置 " 面板。 请接受此面板上的所有选项的缺省值。
    4. 单击 下一步
      将显示 " OSGi 捆绑软件设置 " 面板。 请接受此面板上的所有选项的缺省值。
    5. 单击 完成
    您已创建 OSGi 项目。
  2. 声明 HelloWorldEBA 接口。

    创建名为 com.ibm.ws.eba.helloWorld.api 的软件包,该软件包包含名为 HelloWorldEBA 的接口。 编写此接口以便只包含一个方法:hello()

    1. com.ibm.ws.eba.helloWorld.api 项目下,右键单击文件夹 src,然后选择 新建 >
    2. 将新软件包命名为 com.ibm.ws.eba.helloWorld.api
    3. 单击 完成
    4. 右键单击新软件包,然后选择 新建 > 接口
    5. 将新接口命名为 HelloWorldEBA
    6. 单击 完成
    7. 复制并粘贴以下方法以替换接口文件的内容:
      package com.ibm.ws.eba.helloWorld.api;
      public interface HelloWorldEBA {
      
          public void hello();
      }
    8. 保存并关闭文件。
  3. com.ibm.ws.eba.helloWorld.api 软件包配置为导出的软件包。

    编辑 com.ibm.ws.eba.helloWorld.api 项目中的捆绑软件清单以允许其他捆绑软件装入 com.ibm.ws.eba.helloWorld.api 软件包中的类。 捆绑软件清单中未导出的软件包的类是定义捆绑软件的专用类,并且不能由任何其他捆绑软件装入。

    1. 使用清单编辑器打开捆绑软件 MANIFEST.MF 文件。
      此文件位于 BundleContent/META-INF 目录中。
    2. 单击 运行时 选项卡。
    3. 在 " 导出的软件包 " 窗格中,单击 添加
    4. 从列表中选择 com.ibm.ws.eba.helloWorld.api 包,然后单击 确定
    5. 在 " 导出的软件包 " 窗格中,单击 属性
    6. 在 " 属性 " 对话框中,将 version 设置为 1.0.0,然后单击 确定
    7. 保存并关闭文件。
  4. 创建 com.ibm.ws.eba.helloWorld.service 捆绑软件。 此捆绑软件实现 HelloWorldEBA 接口。
    1. 单击 文件 > 新建 > OSGi 捆绑软件项目
      将显示 " OSGi 捆绑软件项目 " 面板。
    2. 配置项目。
      • 对于项目名称,输入 com.ibm.ws.eba.helloWorld.service
      • 清除 将捆绑软件添加到应用程序 复选框。 如果保留选中此复选框,那么将自动创建一个新 OSGi 应用程序项目,并会将捆绑软件添加到该项目。 但是,将在单独的任务 创建 OSGi 应用程序中手动创建应用程序项目。
      • 让其他选项保留为缺省值。
    3. 单击 下一步
      将显示 " Java 配置 " 面板。 请接受此面板上的所有选项的缺省值。
    4. 单击 下一步
      将显示 " OSGi 捆绑软件设置 " 面板。 请接受此面板上的所有选项的缺省值。
    5. 单击 完成
  5. 使 HelloWorldEBA 接口可用于服务实现捆绑软件。

    编辑客户机捆绑软件清单,以使 com.ibm.ws.eba.helloWorld.api 软件包中的类对服务实现捆绑软件可用。 com.ibm.ws.eba.helloWorld.api 软件包是 com.ibm.ws.eba.helloWorld.api 捆绑软件的一部分。

    1. 展开 com.ibm.ws.eba.helloWorld.service 项目。
    2. 使用清单编辑器打开捆绑软件 MANIFEST.MF 文件。
      此文件位于 BundleContent/META-INF 目录中。
    3. 单击 依赖关系 选项卡。
    4. 在 " 已导入的软件包 " 窗格中,单击 添加
    5. 在 " 软件包选择 " 对话框中,输入 com.ibm.ws.eba,从 导出的软件包 列表中选择 com.ibm.ws.eba.helloWorld.api ,然后单击 确定
      该软件包将添加到“已导入的软件包”列表中。
    6. 已导入的软件包 列表中,选择 com.ibm.ws.eba.helloWorld.api 软件包,然后单击 属性
    7. 在 " 属性 " 对话框中,将 minimum version 设置为 1.0.0 Inclusive,将 maximum version 设置为 1.1.0 Exclusive,然后单击 确定
      此软件包在“已导入的软件包”列表中的条目将更新为 com.ibm.ws.eba.helloWorld.api [1.0.0,1.1.0)

      此版本语法表示 导出的版本介于 1.0.0 (含) 和 1.1.0 (独占) 之间的软件包将与此导入匹配。 有关版本语法的更多信息,请参阅 OSGi Service Platform Release 4 V 4.2 Core Specification 的 3.2.6 版本范围 部分。

      已指定此版本范围以确保仅当软件包的更新版本的微版本值不同时,实现捆绑软件才使用此软件包的更新版本,这是因为一个主要更改(例如,除去接口中的方法)或一个次要更改(例如,将方法添加到接口)都可能导致实现捆绑软件无法正常工作。

    8. 保存并关闭文件。
  6. 实现 HelloWorld 服务。

    创建名为 com.ibm.ws.eba.helloWorld.service 的软件包,该软件包包含名为 HelloWorldService 的实现类。 对此类进行编码以从 HelloWorldEBA 接口实现 hello() 方法。 类的此实现会导致 OSGi Service: Hello World!要显示的

    1. com.ibm.ws.eba.helloWorld.service 项目下,右键单击文件夹 src,然后选择 新建 >
    2. 将新软件包命名为 com.ibm.ws.eba.helloWorld.service
    3. 单击 完成
    4. 右键单击新包,然后选择 新建 >
    5. 将新接口实现类命名为 HelloWorldService
    6. 单击 接口 字段旁边的 添加
    7. 输入 Hello,从 匹配项 列表中选择 HelloWorldEBA ,然后单击 确定
    8. 确保选中 继承的抽象方法 复选框。
    9. 单击 完成
    10. 为继承的 hello() 方法提供实现代码。
      将行
      // TODO Auto-generated method stub
      替换为行
      System.out.println(OSGi Service: Hello World!);
      现在该实现类的完整代码应该如下所示:
      package com.ibm.ws.eba.helloWorld.service;
      
      import com.ibm.ws.eba.helloWorld.api.HelloWorldEBA;
      
      public class HelloWorldService implements HelloWorldEBA {
      
          @Override
          public void hello() {
              System.out.println(OSGi Service: Hello World!);
          }
      
      }
    11. 保存并关闭文件。
  7. 通过使用 OSGi“蓝图”XML 导出 helloWorld 服务。

    蓝图配置包含捆绑软件组件组合件和配置信息。 它也描述了组件如何在 OSGi 服务注册表中注册,或它们如何从 OSGi 服务注册表查找服务。 此信息用于在启动捆绑软件时,在运行时实例化并配置必需的组件。

    1. 在项目 com.ibm.ws.eba.helloWorld.service中,创建 Blueprint XML 文件:
      1. 右键单击 com.ibm.ws.eba.helloWorld.service 项目,然后选择 新建 > 蓝图文件
      2. 请接受此面板上的所有选项的缺省值。
      3. 单击完成
    2. 将 bean 元素添加至“蓝图”XML 文件。
      1. 在 " 设计 " 选项卡中,单击 " 概述 " 窗格中的 添加
      2. 选择 Bean,然后单击 确定
      3. 单击浏览,选择 HelloWorldService,然后单击确定
      4. Bean 标识字段中,输入 HelloEBA,然后单击确定以添加 bean 元素。
    3. 将 service 元素添加到“蓝图”XML 文件。
      1. 在 " 概述 " 窗格中选择 蓝图 ,然后单击 添加
      2. 选择 服务,然后单击 确定
      3. 单击 服务接口 字段旁边的 浏览
      4. 输入 Hello,从 匹配项 列表中选择 HelloWorldEBA ,然后单击 确定
      5. 单击 Bean 引用字段旁边的浏览,选择 HelloEBA,然后单击确定
      6. 单击确定以添加 service 元素。
    4. 检查“蓝图”XML 源代码。
      选择 选项卡。 源代码应该如下所示:
      <?xml version="1.0" encoding="UTF-8"?>
      <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
        <bean id="helloEBA"
          class="com.ibm.ws.eba.helloWorld.service.HelloWorldService"/>
        <service id=HelloEBAService ref="helloEBA"
          interface="com.ibm.ws.eba.helloWorld.api.HelloWorldEBA"/>
      </blueprint>
      在前一个代码块中:
      • bean 元素定义要实例化的“蓝图”组件。 在此示例中, bean 元素通过调用 com.ibm.ws.eba.helloWorld.service.HelloWorldService 类的构造函数来使 Bean helloEBA 实例化。
        • id 属性标识 bean。 如果从“蓝图”信息中的任何其他位置引用 bean(例如,从 service 元素),那么必须指定此属性。
        • class 属性指定实例化 bean 的哪个实施类。
      • service 元素定义 OSGi 服务注册表中组件的注册。 在此示例中, service 元素将名为 helloEBA 的 Bean 注册为具有接口 com.ibm.ws.eba.helloWorld.api.HelloWorldEBA的 OSGi 服务注册表中的服务 (由接口属性指定)。
        • ref 属性指示要注册的 bean 的 id。 此 idbean 元素中定义。
        • interface 属性指示 bean 类实现的接口。
      有关更多信息,请参阅 OSGi Service Platform Release 4 V 4.2 Enterprise Specification 的 121.5 Bean Manager 部分和 121.6 Service Manager 部分。
    5. 保存并关闭文件。
    注: 您可能会收到异常消息 (在 " 问题 " 窗格中可视) ,指出构建属性文件中没有 OSGI-INFbin.include 条目。 如果看到此消息,请使用快速修正选项添加该条目(右键单击该问题,然后选择快速修正)。

结果

已创建两个捆绑软件:com.ibm.ws.eba.helloWorld.apicom.ibm.ws.eba.helloWorld.servicecom.ibm.ws.eba.helloWorld.service 服务实现在 com.ibm.ws.eba.helloWorld.api 捆绑软件中声明的 HelloWorldEBA 接口并包含导出 com.ibm.ws.eba.helloWorld.service 服务时所需的业务逻辑和元数据。

下一步做什么?

现在,您可以使用 com.ibm.ws.eba.helloWorld.service 服务的 创建客户机捆绑软件