上节课我们看了一个简单的Hello World Bundle,它在启动和停止的时候打印了一些信息。它继承了接口BundleActivator,并且实现了start和stop方法。我们来再看一下代码。特别是start方法和stop方法的实现,你是否注意到我们在方法里传入了一个参数——BundleContext。在这次的课程里,我们就来看一下BundleContext,以及我们可以用它来做什么。
BundleContext是OSGi框架送给我们的Bundle的一张不可思议的门票。当我们需要同OSGi框架进行交互的时候,我们需要使用BundleContext。事实上,这是唯一同OSGi的API进行交互的途径。并且OSGi框架对每一个Bundle发放了门票,以便每一个Bundle在启动的可以通过BundleActivator与框架进行交互。
如果你的Equinox也就是OSGi并没有停止的话,那你不需要启动它。如果它没有运行,请记住启动使用个这个命令将它启动(现将工作目录转移到OSGi测试目录里,详细请看第一部分)。
- java -jar equinox.jar -console
java -jar equinox.jar -console
根据提示符输入“ss”,然后你将会看到上次已经安装的Hello World Bundle。即使你已经关闭了OSGi服务并且又启动了它,你依然会看到这个情况。这是因为OSGi框架会自动将它的启动到运行的状态保留在配置文件中。为了证明这个,我们将写一个Bundle,这个Bundle将会自动寻找并且卸载Hello World Bundle。我们可以在控制台里使用“uninstall”命令轻松的实现这个功能。并且我们将学习如何利用OSGi的API进行编程。所以,现在建立一个名叫“HelloWorldKiller”的Java文件,并且将以下代码复制粘贴到里面。
- import org.osgi.framework.*;
-
-
public class HelloWorldKiller implements BundleActivator {
-
public void start(BundleContext context) {
-
System.out.println("HelloWorldKiller searching...");
- Bundle[] bundles = context.getBundles();
-
for (int i = 0; i < bundles.length; i++) {
-
if ("HelloWorld".equals(bundles[i].getSymbolicName())) {
-
try {
-
System.out.println("Hello World found, " + "destroying!");
- bundles[i].uninstall();
-
return;
-
} catch (BundleException e) {
-
System.err.println("Failed: " + e.getMessage());
- }
- }
- }
-
System.out.println("Hello World bundle not found");
- }
-
-
public void stop(BundleContext context) {
-
System.out.println("HelloWorldKiller shutting down");
- }
- }
import org.osgi.framework.*;
public class HelloWorldKiller implements BundleActivator {
public void start(BundleContext context) {
System.out.println("HelloWorldKiller searching...");
Bundle[] bundles = context.getBundles();
for (int i = 0; i < bundles.length; i++) {
if ("HelloWorld".equals(bundles[i].getSymbolicName())) {
try {
System.out.println("Hello World found, " + "destroying!");
bundles[i].uninstall();
return;
} catch (BundleException e) {
System.err.println("Failed: " + e.getMessage());
}
}
}
System.out.println("Hello World bundle not found");
}
public void stop(BundleContext context) {
System.out.println("HelloWorldKiller shutting down");
}
}
然后我们同样创建一个名叫HelloWorldKiller.MF的manifest文件。并将以下代码粘贴到里面。再次强调一下,在结尾处一定要留一个空行,否则程序无法运行。
- Manifest-Version: 1.0
-
Bundle-ManifestVersion: 2
- Bundle-Name: DBLoginBundle Plug-in
- Bundle-SymbolicName: Login_DBLoginBundle
-
Bundle-Version: 1.0.0
- Bundle-Activator: HelloWorldKiller
- Bundle-ActivationPolicy: lazy
-
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-
Import-Package: org.osgi.framework;version="1.3.0"
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: DBLoginBundle Plug-in
Bundle-SymbolicName: Login_DBLoginBundle
Bundle-Version: 1.0.0
Bundle-Activator: HelloWorldKiller
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework;version="1.3.0"
然后使用命令对这个Bundle进行打包。
- > javac -classpath equinox.jar HelloWorldKiller.java
-
> jar -cfm HelloWorldKiller.jar HelloWorldKiller.mf HelloWorldKiller.class
> javac -classpath equinox.jar HelloWorldKiller.java
> jar -cfm HelloWorldKiller.jar HelloWorldKiller.mf HelloWorldKiller.class
打包完后,我们回到OSGi控制台,使用命令“install file:HelloWorldKiller.jar”(“file”后是这个jar文件命)安装这个Bundle。然后使用“ss”查看目前的Bundle状态。大致情况如下:
- id State Bundle
-
0 ACTIVE system.bundle_3.2.1.R32x_v20060919
-
1 ACTIVE HelloWorld_1.0.0
-
2 INSTALLED HelloWorldKiller_1.0.0
id State Bundle
0 ACTIVE system.bundle_3.2.1.R32x_v20060919
1 ACTIVE HelloWorld_1.0.0
2 INSTALLED HelloWorldKiller_1.0.0
然后我们通过运行“start 2”这个命令来启动Hello World Bundle。你将会在控制台看到如下信息:
- HelloWorldKiller searching...
- Hello World found, destroying!
- Goodbye EclipseZone Readers!
HelloWorldKiller searching...
Hello World found, destroying!
Goodbye EclipseZone Readers!
注意到了最后一行的输出吗?那是我们最初的Hello World Bundle。因为在我们运行Hello World Killer之前,它是处于运行状态的。当它被卸载的时候,先要被停止。因此,BundleActivator的stop方法会被执行。
然后我们再次输入“ss”查看一下Bundle的运行状态。HelloWorld的Bundle消失了。变成了下面的情况:
- id State Bundle
-
0 ACTIVE system.bundle_3.2.1.R32x_v20060919
-
2 ACTIVE HelloWorldKiller_1.0.0
id State Bundle
0 ACTIVE system.bundle_3.2.1.R32x_v20060919
2 ACTIVE HelloWorldKiller_1.0.0
你可能通过上面的讲述惊奇的发现那里存在一个安全问题:我们可以通过任何一个Bundle卸载其他的Bundle。我们很幸运,OSGi有套全面的安全措施。这可以让我们在与OSGi框架进行交互的时候,灵活的控制每一个细节。简单的来说,你可以通过建立一个特殊的管理员Bundle来限制卸载其他Bundle的行为。然而,获得安全保障的工作最重要的是配置文件的定义。而我们这一系列的课程把焦点集中在代码上。
以上就是这节课的全部内容。在下节课中,我们来看一下BundleContext接口并且看看我们能用它做什么。比如,我们是否可以用installBundle方法来进行一个Bundle的安装,或者查看运行中的Bundle的信息,并且打印出Bundle最近的修改时间和内容。为了更好的进行下堂课的学习,请先查阅一下OSGi Release 4 API的帮助文档。
分享到:
相关推荐
Spring是一个流行的Java应用框架,OSGI与Spring的结合可以提供更强大的模块化能力。Spring Dynamic Modules(Spring-DM)是用于OSGI的Spring扩展,它使得Spring应用可以无缝地在OSGI环境中运行。通过Spring-DM,你...
BundleContext提供了与OSGi框架交互的执行时上下文环境,它用于访问框架提供的各种服务。而Bundle接口则代表了OSGi框架中的一个逻辑bundle。 6. 动态性与灵活性:OSGi框架的一个核心优势是其模块的动态性。开发者...
2. **Eclipse集成开发环境**:Eclipse从3.0版本开始采用OSGi框架(Equinox),提升了性能、可扩展性,并简化了二次开发。 3. **企业级应用**:IBM WebSphere、BEA microServices、Apache Struts、Spring等均使用...
### Spring OSGi 入门知识点...以上内容为Spring OSGi入门的基本知识点,涵盖了Spring DM的基础概念、配置方法以及如何在OSGi环境中导出和引用服务等内容。这些知识点对于理解如何将Spring与OSGi结合使用具有重要意义。
在OSGi框架中,服务层是位于应用程序之上的一层,它为服务提供者和消费者之间的交互提供了一种机制。这一层的主要目的是实现组件之间的松耦合通信,即组件不需要知道彼此的具体实现细节,仅通过服务接口进行通信。 ...
《OSGI入门和整合Spring》则关注OSGI与Spring框架的结合,主要讨论: 1. **Spring与OSGI集成原理**:Spring的bean管理如何与OSGI服务机制相结合,实现更灵活的依赖注入。 2. **Declarative Services(DS)**:利用...
### OSGi 入门与实践 #### OSGi 的历史背景 OSGi,全称为 Open Service Gateway Initiative,从字面上理解,它最初被设计为一个面向服务的平台。1999 年,OSGi 联盟成立,旨在为通过网络向设备提供服务建立开放的...
在OSGI入门阶段,首先要理解的是它的基本概念,如bundle(模块)、服务、生命周期管理和依赖管理。Bundle是OSGI中的核心组件,它类似于Java的JAR文件,但具有自己的元数据和生命周期。每个bundle可以导出和导入服务...
本书《深入理解OSGi:Equinox原理、应用与最佳实践》深入剖析了OSGi技术的原理和应用,着重介绍了基于OSGi R5.0规范的内容,并结合了Equinox框架的实践经验,旨在帮助读者更好地理解和应用OSGi技术。 本书共分为四...
书中可能包含了源码分析,帮助读者理解OSGi框架的内部工作机制,以及如何优化和调试基于OSGi的应用。 《OSGi R4核心规范 《中英文》》是OSGi联盟发布的官方文档,包含了OSGi R4版本的详细规范,包括模块化系统、...
本教程以经典实例为基础,旨在帮助新手快速入门OSGI,同时也对经验丰富的开发者具有参考价值。 首先,理解OSGI的基本概念至关重要。OSGI框架由一组称为"bundle"的模块组成,每个bundle都是一个自包含的Java程序单元...
**OSGi入门** OSGi(Open Service Gateway Initiative)是一个开放标准,它定义了一种模块化系统,用于在Java平台上构建动态、可管理的应用程序。这个技术最初的目标是为家庭网络设备提供服务网关,但随着时间的...
**标题:“OSGi入门”** **描述:** 这篇博客文章主要介绍了OSGi(Open Services Gateway Initiative)的基础知识,包括它的起源、概念以及在Java开发中的应用。作者通过一个实际的例子来帮助读者理解如何使用OSGi...
**三、Spring OSGi入门** 1. **环境搭建**:首先需要安装一个支持OSGi的运行时环境,如Apache Felix或Equinox,然后配置Spring OSGi容器,如Spring DM(现在已改名为SpringSource dm Server)。 2. **编写bundle**:...
服务机制则允许bundle之间进行松耦合的交互;版本化则确保bundle的向后兼容性。 3. OSGi的优势: OSGi带来的优势包括模块化开发、易于维护和更新以及减少资源浪费。模块化开发允许开发者独立开发和测试各个模块,...
“相应的bundle”指的是在OSGi环境中运行的软件组件,它们是具有特定功能的自包含单元,可以通过OSGi框架进行加载、卸载和更新,无需影响其他服务。这些bundle可以是第三方库、应用程序模块或者系统服务,通过声明式...
重复提及"Tomcat-Osgi JAR包"强调了这个组件在实现Tomcat与OSGi交互中的核心地位。 【标签】"Tomcat-Osgi JAR包"标签明确了我们要关注的是与Tomcat和OSGi集成相关的Java档案文件,它们是实现两者整合的基础。 ...
OSGi的核心是其服务注册表,它允许模块之间通过发布和查找服务来进行交互。每个OSGi模块(称为bundle)都是一个独立的JAR文件,有自己的类加载器,这确保了模块间的隔离性。开发者可以通过定义元数据来控制bundle的...