引言
本文是本系列的第 1 部分,我们将开发包含客户端和服务器端组件的订单应用程序。然后将这些组件打包为 OSGi 包。客户端调用服务组件处理订单。服务组件具有处理订单和打印订单 ID 的方法。阅读本文后,您可以应用 Apache Felix 的概念和功能来将 Java 组件类构建和打包为 OSGi 包。
系统要求
要运行本文中的示例,请确保已在计算机上安装和设置了以下软件:
Java 5 或更高版本
Ant 构建工具
Apache Felix 二进制分发版 1.0.4
接下来,设置以下环境变量(按照示例 ANT_HOME=C:\apache-ant-1.7.0 进行设置):
JAVA_HOME(用于 Java)
ANT_HOME(用于 Ant)
接下来,将以下内容添加到 PATH 环境变量:
JAVA_HOME\bin
ANT_HOME\bin
回页首
OSGi
OSGi 规范以更为动态的方式定义和传播 Java 应用程序的模块化。通常,Java 应用程序模块化为 JAR 包。但是使用 JAR 文件有局限性:
JAR 包通过类路径环境变量解析,而这并未提供管理 JAR 依赖关系的可靠框架。
JAR 无法进行版本控制,因此无法跟踪所创建或修改的 JAR 包的历史。
没有用于在运行时出现代码更改的情况下动态更新 JAR 文件的框架。
为了处理上述问题,可以使用 OSGi 框架,因为其中对 Java 的模块化系统进行了重新定义。相对于传统的 JAR 模块而言,基于 OSGi 的系统具有以下优势:
OSGi 提供了可靠的集成环境,包可以在其中作为服务发布并导出供其他包使用。
OSGi 为每个新组件提供了包版本控制功能。因此可以跟踪包创建和更改的历史。
通过 OSGi,可以在运行时出现更改的情况下随时动态更新包。
目前有三个已知的 OSGi 实现:
Equinox
Knopflerfish
Felix
本系列文章将介绍如何将 Felix 作为 OSGi 容器使用。本系列文章涵盖以下主题:
第 1 部分介绍如何使用 OSGi API 进行组件开发。
第 2 部分将重点介绍在 OSGi 容器中使用 Spring 和从组件类消除 OSGi API 依赖关系,从而使其成为传统 Java 对象(plain old Java objects,POJO)。这样做的优势在于,只需将重点放在编写组件类中的业务方法上,而由 Spring 配置文件处理组件的生命周期。
回页首
订单应用程序
接下来让我们看看如何使用基于 Felix 的 OSGi 框架创建订单应用程序包。此应用程序包括两个组件:OrderClient.java(客户端)和 OrderService.java(服务器端)。客户端组件打包为 client.jar,服务器组件打包为 order.jar。接下来让我们首先看看 OrderClient类。
清单 1. 客户端组件 OrderClient
public class OrderClient implements BundleActivator {
private ServiceTracker orderTracker;
private OrderService orderService;
public void setService(OrderService orderService) {
this.orderService = orderService;
}
public void removeService() {
this.orderService = null;
}
public void start(BundleContext context) throws Exception {
orderTracker =
new ServiceTracker(context, OrderService.class.getName(), null);
orderTracker.open();
OrderService order = (OrderService) orderTracker.getService();
if (order == null) {
System.out.println("Order service not available");
} else {
order.processOrder();
}
}
public void stop(BundleContext context) {
System.out.println("Bundle stopped");
orderTracker.close();
}
}
正如清单 1 中所示,OrderClient 对 OrderService 组件调用 processOrder 方法,以在启动 client.jar 包时打印 orderID。此类实现BundleActivator 接口,该接口具有两个回调方法:start() 和 stop()。启动和停止客户端包时,Felix 容器将调用实现的 start() 和stop() 方法。
接下来让我们仔细分析一下 start() 方法。在 start() 方法中,首先获得 ServiceTracker 类的引用。您可以将此类视为工厂类。然后通过调用此 getService 方法从此工厂类获取服务引用。ServiceTracker 使用以下参数构造:包上下文和 OrderService 类的名称。
清单 2. OrderService 实现
public class OrderServiceImpl implements OrderService, BundleActivator {
private ServiceRegistration registration;
public void start(BundleContext context) {
registration =
context.registerService(OrderService.class.getName(), this, null);
System.out.println("Order Service registered");
}
public void stop(BundleContext context) {
System.out.println("Order Service stopped");
}
public void processOrder() {
System.out.println("Order id: ORD123") ;
}
}
服务器端 order.jar 文件包含两个组件:OrderService 接口和 OrderServiceImpl 类。此接口具有由 OrderServiceImpl 类实现的抽象类 processOrder。此类还实现了 BundleActivator 接口,此接口供 Felix 容器调用来启动和停止 order.jar 包。start() 方法在注册中心注册 OrderService 组件,以供客户端包使用。注册与导出对象供其他包使用的作用一样。
回页首
通过 Manifest 通信
真正的问题是,客户端包如何知道注册的服务包?此通信通过使用 Manifest 文件处理。在 Manifest 文件中,在导入和导出程序包中提供包的引用。客户端包 Manifest 通常导入服务组件程序包,而服务包 Manifest 导出自己的程序包。请注意,当包 A 导入包 B 的程序包时,包 B 必须导出自己的程序包。没有恰当的导入和导出定义,通信将失败。
清单 3. 客户端清单文件
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Order Service Client
Bundle-SymbolicName: orderclient
Bundle-Version: 1.0.0
Bundle-Activator: order.client.OrderClient
Import-Package: org.osgi.framework, org.osgi.util.tracker, order
清单 4. 服务器清单文件
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Order Service
Bundle-SymbolicName: orderservice
Bundle-Version: 1.0.0
Export-Package: order
Bundle-Activator: order.impl.OrderServiceImpl
Import-Package: org.osgi.framework
对于订单应用程序,client.jar 包 Manifest 中包含条目 Import-Package: org.osgi.framework, org.osgi.util.tracker, order。这个实际上表示,客户端包导入核心 OSGi 程序包和 OrderService 程序包。类似地,order.jar 包清单包含条目 Export-Package: order。即,包导出其程序包供客户端使用。如果导入和导出未显式声明,OSGi 将引发运行时错误。
Manifest 文件还包含其他信息,如包激活器类的名称等。激活器类负责在包中调用 start() 和 stop() 方法。在本例中,client.jar 包的激活器类为 OrderClient,order.jar 包的激活器类为 OrderService。
回页首
部署
在部署和使用包前,请进行以下工作:
根目录 C:\osgi 文件夹下创建图 1 中所示的目录结果,并将本文前面介绍的组件放入其中:
Java 代码放入相应的程序包文件夹(客户端和服务)。
清单文件放入相应的 META-INF 文件夹(客户端和服务)。
图 1. 代码目录结构
代码目录结构
下一步便是部署这些包。请通过以下步骤,使用 Felix OSGi 容器部署客户端和服务包:
在服务文件夹中使用 ANT 运行 build.xml。
在客户端文件夹中使用 ANT 运行 build.xml。
执行了上述构建文件后,将分别在 client/bin 和 service/bin 文件夹中创建 client.jar 和 order.jar 包。
在 Microsoft® Windows® 命令提示符中运行 startfelix.bat,以启动 Felix 运行时。
每次启动 Felix 运行时,都会提示配置文件名称。配置文件名称的作用类似于项目名称。可以提供任何名称作为项目配置文件的名称。对于 Felix 运行时的每次后续启动,如果提供了之前输入的相同配置文件名称,Felix 将会加载与该项目名称关联的所有已安装包。如果提供了新配置名称,则将需要再次显式安装各个包:
在 Felix Shell 中提供以下命令,以安装各个包:
install file:service/bin/order.jar
install file: client/bin/client.jar
start service_bundle_id
start client_bundle_id
为了指示包的 ID,可以使用 ps 命令。必须首先启动服务包,然后启动客户端包。在启动相应的包时,将显示以下输出(请参见图 2)。
图 2. 程序输出
程序输出
还可以通过在 Felix Shell 提供 update bundle_id 命令更新包。包将在运行时动态更新。
回页首
结束语
本文简单介绍了 OSGi 框架的功能和概念,并说明了如何使用其创建动态 JAR 包。您了解了如何构建并将组件打包为 OSGi 包,然后在 Felix 运行时环境中运行。我们还了解了如何创建包 Manifest 文件,以作为包之间的通信接口使用。
OSGi 提供了一种新的构建和管理 JAR 包的方式。请继续关注本系列的第 2 部分,我们将介绍 Spring 框架在 OSGi 环境中如何代替 OSGi 承担管理包的责任。
资源使用说明:
下连接的资源中,felix版本为 1.4.0,所需要的环境文中已经说明。需要注意的是:
在运行ant编译service以及client时,修改client/build.xml 中的felix_home 变量,否则会出现编译出错。
使用到的下载地址:
http://download.csdn.net/detail/icecream0/4187317
分享到:
相关推荐
这本书为想要入门OSGi和Apache Felix的开发人员提供了一个详细的学习路径,涵盖了基础知识到实践应用的各个环节。学习完这本书之后,开发人员将能够使用Felix框架构建自己的模块化应用程序,并理解OSGi技术如何在...
包含电子书和第04、05、06、07、08、09、10、11、13章的代码, 是学习OSGi和Apache Felix的一个很好的入门资料, 虽然版本有一点点老了, 但是基本的东西没有变, 值得下下来一看!
- **环境准备**:安装一个 OSGi 容器,如 Apache Felix 或 Equinox,这些都是 Spring OSGi 支持的容器。 - **创建 bundle**:将 Spring 应用打包为 OSGi bundle,确保所有依赖都被包含并正确配置版本。 - **配置 ...
- **选择OSGi实现**:如Apache Felix、Equinox等,它们提供了运行时环境。 - **集成Spring**:引入Spring OSGi相关的库,如spring-osgi-core、spring-osgi-io等。 - **配置Bundle**:创建Manifest.MF文件,声明...
Apache Felix是Apache软件基金会开发的一个开源的OSGi(Open Service Gateway Initiative)框架实现。OSGi是一种模块化系统和Java服务平台,它定义了一个标准的框架,用于管理Java应用程序的生命周期和依赖关系。...
标题中的“tomcat-osgi”指的是将开源的Java应用服务器Apache Tomcat与OSGi(Open Service Gateway Initiative)框架集成的版本。OSGi是一种模块化系统,主要用于Java应用程序,它允许开发者将应用程序分解为一系列...
6. **打包和部署**:将所有bundle打包成jar文件,并部署到支持OSGI的容器(如Apache Felix、Eclipse Equinox等)中。在容器中,你可以动态安装、启动、停止和更新这些bundle。 整合OSGI和Spring可以带来很多好处,...
本书基于作者多年使用OSGi的经验而编写,涵盖了...最后对OSGi知识进行深入讲解,通过对OSGi规范和实现框架(Equinox、Felix、Spring-DM和Apache CXF)的分析,以及最佳实践的介绍,帮助读者更好地掌握如何使用OSGi。
最后对OSGi知识进行深入讲解,通过对OSGi规范和实现框架(Equinox、Felix、Spring-DM和Apache CXF)的分析,以及最佳实践的介绍,帮助读者更好地掌握如何使用OSGi。 本书适合希望了解、深入掌握OSGi,以及编写模块化...
5. **felix或equinox等OSGI实现**:熟悉至少一种OSGI容器,比如Apache Felix或Eclipse Equinox,它们提供了运行OSGI应用的平台。 通过分析这两个示例源码,你可以深入理解OSGI的工作原理,包括bundle间如何交互、...
1. 安装OSGi容器:首先,你需要一个支持Spring OSGi的OSGi容器,如Apache Felix或Equinox。这些容器提供了运行Spring OSGi应用的基础环境。 2. 创建Spring OSGi Bundle:使用Spring的osgibundle.xml配置文件,定义...
- **运行时选择**: 有多个 OSGi 容器可供选择,如 Apache Felix、Equinox、Knopflerfish 等,它们提供了不同的特性和性能。 ### 6. 示例应用 学习 Spring OSGi 通常从创建一个简单的服务提供者和消费者开始。创建...
3. **部署与打包**:学习如何将OSGI应用打包成bundle并部署到OSGI运行时环境,如Apache Felix或Karaf。 4. **调试与监控**:了解OSGI环境下如何进行日志跟踪、性能分析和故障排查。 《OSGI入门和整合Spring》则关注...
**标题:“felix-framework-6.0.1.rar”** **描述分析:** 这个压缩包“felix-framework-6.0.1.rar”是Apache Felix框架的一个...无论是新手还是经验丰富的开发者,都可以通过这个压缩包快速入门和深入了解OSGi技术。
此外,可能还会介绍使用工具,如Eclipse Equinox或Apache Felix,来构建和管理OSGI应用。在实践中,你可能会遇到如何解决模块间的依赖冲突、如何有效地组织模块结构以及如何利用OSGI的动态性进行热更新等问题。 ...
4. **felix或equinox**:Felix和Equinox是两个常用的OSGi运行时实现,它们提供了API和框架,用于构建和运行OSGi应用。 5. **Blueprint或Declarative Services**:这两种是OSGi中的服务配置方式,Blueprint更接近XML...
标签“源码 工具”表明,这篇博文可能会涉及实际的代码示例和使用到的OSGi开发工具,比如Eclipse Equinox或Apache Felix等。读者可以期待看到如何配置和使用这些工具来创建和管理OSGi bundles(模块)。 压缩包内的...
- **Felix**:Apache软件基金会的项目,提供了一个轻量级的OSGi实现。 - **Karaf**:基于Felix,提供了一种命令行界面和更高级的容器功能。 4. **OSGi开发**: - **构建工具**:Maven和Gradle都有插件支持OSGi ...
在开始编写OSGi bundle之前,需要安装一个OSGi框架,例如Apache Felix或Equinox。 **2.4 设置Eclipse** 配置Eclipse以支持OSGi开发涉及安装必要的插件和设置工作区。 **2.5 运行Felix** Apache Felix是一个流行...