http://230996.blog.chinajavaworld.com/entry/3678/0/
欢迎回来EclipseZone OSGi指导系列。
上一次,我们看了一个简单的Hello World的Bundle在开始和结束的时候输出一段信息。它通过实现BundleActivator接口和start和stop方法。现在再看看代码,在特定方法start和stop方法的标记中,你将注意到我们传递了一个参数BundleContext。在指导的这个部分中,我们将研究下BundleContext并且我们能用它来做什么。
BundleContext是一个OSGi框架传递给我们的Bundle的一个魔力入场券。当代码需要在任何时候与框架交互时,你将用到BundleContext。事实上这是用OSGi API交互的唯一方法,并且框架在Bundle启动的时候将这些入场券发通过它们的BundleActivator发给每一个Bundle。
如果你从上次课程一直有个Equinox在运行,你不需要重启它。如果它没有运行,那么记住启动它的命令:
1
|
> java -jar equinox.jar –console
|
在提示符后输入ss并且你将看到上次课程的Hello World Bundle一直处于installed。甚至在你关闭并重启Equinox之后,因为OSGi框架还残留着运行之间它的状态。
对于这次练习,我们将写一个Bundle搜索出并卸载Hello World。我们可以从控制台简单的使用usinstall命令,但是我们想见识下它如何使用OSGi API程序化的完成。所以,我们创建一个新的名为HelloWorldKiller.jar文件并复制如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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");
}
}
|
现在创建manifest。再说下,记住结尾的空行是非常重要的。复制以下内容到HelloWorldKiller.mf:
1
2
3
4
5
6
7
|
Manifest-Version: 1.0
Bundle-Name: HelloWorldKiller
Bundle-Activator: HelloWorldKiller
Bundle-SymbolicName: HelloWorldKiller
Bundle-Version: 1.0.0
Import-Package: org.osgi.framework
|
现在,编译并建立Jar:
1
2
|
> javac -classpath equinox.jar HelloWorldKiller.java
> jar -cfm HelloWorldKiller.jar HelloWorldKiller.mf HelloWorldKiller.class
|
回到OSGi控制台,使用install file:HelloWorldKiller.jar安装新的Bundle,然后输入ss。状态列表现在看起来会像这样:
1
2
3
4
|
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 Killer。你将看到如下输出:
1
2
3
|
HelloWorldKiller searching...
Hello World found, destroying!
Goodbye EclipseZone Readers!
|
注意,最后一行输出来自于我们原始的Hello World Bundle。因为我们运行Killer之前它是active状态,它要变成uninstalled前变为stoped,由于它的BundleActivator的stop方法运行了。
再看下ss的输出结果,Hello World消失了。
1
2
3
|
id State Bundle
0 ACTIVE system.bundle_3.2.1.R32x_v20060919
2 ACTIVE HelloWorldKiller_1.0.0
|
你可能惊叹这是一个安全问题。出现了任何一个Bundle可以卸载任何其它的Bundle!幸运的是OSGi有一个全面的安全层给予所有框架交互的细粒度控制,例如你可能限制卸载一个指定的“管理”Bundle的权限。然而,获得安全工作大部分是一个配置问题,并且在这个系列中,我们将聚焦于这些代码。
这就是这部分的内容了。在下次前,为什么不看看BundleContext接口和看看你还能使用它来做些什么?例如,你可以试着使用installBundle方法来程序化的装载一个新的Bundle。或者你可以获得所有当前安装的Bundle的列表并输出它们最后一次修改的日期和时间。为了帮助你入门,查看Javadocs for the OSGi Release 4 APIs。
参考:
原始文章http://www.eclipsezone.com/eclipse/forums/m92131032.html
分享到:
相关推荐
Spring是一个流行的Java应用框架,OSGI与Spring的结合可以提供更强大的模块化能力。Spring Dynamic Modules(Spring-DM)是用于OSGI的Spring扩展,它使得Spring应用可以无缝地在OSGI环境中运行。通过Spring-DM,你...
BundleContext提供了与OSGi框架交互的执行时上下文环境,它用于访问框架提供的各种服务。而Bundle接口则代表了OSGi框架中的一个逻辑bundle。 6. 动态性与灵活性:OSGi框架的一个核心优势是其模块的动态性。开发者...
OSGi(Open Services Gateway Initiative)是一种Java平台上的模块化服务框架,它定义了一种标准,使得开发者能够构建可互操作的、动态的、模块化的软件系统。OSGi的核心概念是基于Java的模块化,它的主要目标是为...
### 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技术。 本书共分为四...
"SCA服务构件架构.pdf"可能是关于Service Component Architecture(SCA)的资料,这是一个用于构建分布式应用程序的模型,与OSGi相似,但更注重服务的组合和交互。SCA可以与OSGi结合使用,以构建更加灵活和可扩展的...
**OSGi入门** OSGi(Open Service Gateway Initiative)是一个开放标准,它定义了一种模块化系统,用于在Java平台上构建动态、可管理的应用程序。这个技术最初的目标是为家庭网络设备提供服务网关,但随着时间的...
本教程以经典实例为基础,旨在帮助新手快速入门OSGI,同时也对经验丰富的开发者具有参考价值。 首先,理解OSGI的基本概念至关重要。OSGI框架由一组称为"bundle"的模块组成,每个bundle都是一个自包含的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**:...
OSGi的学习曲线相对陡峭,新入门的开发者可能需要一段时间来熟悉其复杂的规范和概念。此外,OSGi开发社区相较于其他主流技术较不活跃,这可能会给寻找资源和支持带来一定挑战。不过,随着微服务架构的普及,越来越多...
OSGi的核心是其服务注册表,它允许模块之间通过发布和查找服务来进行交互。每个OSGi模块(称为bundle)都是一个独立的JAR文件,有自己的类加载器,这确保了模块间的隔离性。开发者可以通过定义元数据来控制bundle的...
标题中的“tomcat-osgi”指的是将开源的Java应用服务器Apache Tomcat与OSGi(Open Service Gateway Initiative)框架集成的版本。OSGi是一种模块化系统,主要用于Java应用程序,它允许开发者将应用程序分解为一系列...
OSGi(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许开发人员创建可独立部署、可热更新和可交互操作的模块化应用程序。本文将深入介绍OSGi的基本概念,包括其与J2EE的对比,以及模块...