- 浏览: 1658675 次
- 性别:
文章分类
- 全部博客 (2929)
- 非技术 (18)
- Eclipse (11)
- JAVA (31)
- 正则表达式 (0)
- J2EE (4)
- DOS命令 (2)
- WEB前端 (52)
- JavaScript (69)
- 数据库 (8)
- 设计模式 (0)
- JFreechart (1)
- 操作系统 (1)
- 互联网 (10)
- EasyMock (1)
- jQuery (5)
- Struts2 (12)
- Spring (24)
- 浏览器 (16)
- OGNL (1)
- WebService (12)
- OSGi (14)
- 软件 (10)
- Tomcat (2)
- Ext (3)
- SiteMesh (2)
- 开源软件 (2)
- Hibernate (2)
- Quartz (6)
- iBatis (2)
最新评论
本文是《你 好,OSGi 》系列的第三部分。之前介绍过OSGi是什么 ,以及OSGi Bundle 的 使用,下面介绍OSGi依赖性管理。
OSGi依赖性管理
OSGi允许您把您的应用程序分成多个模块,并能管理这些模块之间的依赖性。为了达到这个目的,它引入了Bundle访问域的概念。Bundle中 类的缺省访问范围只对本Bundle内部可见,但对其它任何Bundle都是不可见的;在Bundle内部,类的可访问性遵循Java语言的一般规范。那 么,您如果想要从一个Bundle中访问另一个Bundle中的类,您应该怎么办呢?解决方法是将源Bundle中的包导出来,然后把它们导入到目标 Bundle中。在本小结中,我们将通过一个示例程序说明这个概念。
首先,我们新建一个名com.javaworld.sample.HelloService的Bundle,并从其中导出一个包,然后将该包导入到 我们的com.javaworld.sample.HelloWorld Bundle中。
4.1. 导出Java包
我们开始新建一个com.javaworld.sample.HelloServiceBundle,并从其中导出一个Java包,具体步骤如下:
1) 新建com.javaworld.sample.HelloService Bundle,具体步骤请参见上小节中新建com.javaworld.sample.HelloWorldBundle的步骤;
2) 在HelloService Bundle中,新建一个com.javaworld.sample.service.HelloService.java接口,其源代码如清单3所示。
源代码清单3. HelloService.java
package com.javaworld.sample.service;
public interface HelloService {
public String sayHello();
}
3) 新建类com.javaworld.sample.service.impl.HelloServiceImpl.java,该类实现 HelloService接口,其源代码如清单4所示。
源代码清单4. HelloServiceImpl.java
package com.javaworld.sample.service.impl;
import com.javaworld.sample.service.HelloService;
public class HelloServiceImpl implements HelloService {
public StringsayHello() {
System.out.println("InsideHelloServiceImple.sayHello()");
return"Say Hello";
}
}
4) 请在您的Eclipse Manifest编辑器中打开HelloService包中的MANIFEST.MF文件,点击“Runtime(运行时)” 标签,在“导出包”小节,单击“Add(添加)”按钮,并选择com.javaworld.sample.service包。这 时,HelloServiceBundle中的MANIFEST.MF文件代码应如源代码清单5所示。
源代码清单5. HelloService Bundle中的Manifest文件
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: HelloService Plug-in
Bundle-SymbolicName:com.javaworld.sample.HelloService
Bundle-Version: 1.0.0
Bundle-Vendor: JAVAWORLD
Bundle-Localization: plugin
Export-Package: com.javaworld.sample.service
Import-Package:org.osgi.framework;version="1.3.0"
您可以看到,HelloService Bundle中的MANIFEST.MF文件和HelloWorldBundle非常相似,唯一的区别就是多了一个Export-Package属性头, 该属性头的值为com.javaworld.sample.service;Export-Package属性头通知OSGi容器,其它Bundle可以 从HelloService Bundle外面访问com.javaworld.sample.service包中的类。请注意,在示例代码中,我们只暴露了接口类 HelloService,而没有暴露其实现类的HelloServiceImpl。
4.2. 导入Java包
下面,我们将从HelloServiceBundle中导出的com.javaworld.sample.service包并将其导入到 HelloWorldBundle中,具体步骤如下:
1). 请在com.javaworld.sample.HelloWorld Bundle中找到MANIFEST.MF文件,并在Manifest编辑器中打开,点击“Dependencies(依赖性)”标签,然后点击 “ImportPackage(导入包)”按钮,将com.javaworld.sample.service添加为导入包,这时,您的 HelloWorldBundle中的MANIFEST.MF文件内容应如源代码清单6所示:
源代码清单6. HelloWorld Bundle中的MANIFEST.MF文件
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: HelloWorld Plug-in
Bundle-SymbolicName: com.javaworld.sample.HelloWorld
Bundle-Version: 1.0.0
Bundle-Activator: com.javaworld.sample.helloworld.Activator
Bundle-Vendor: JAVAWORLD
Bundle-Localization: plugin
Import-Package: com.javaworld.sample.service,
org.osgi.framework;version="1.3.0"
从上面的代码可以看出,Import-Package属性头的值是一个由逗号分隔的字符串,这是您想导入包的列表。在 HelloWorldBundle示例代码中,我们引入了两个包,即com.javaworld.sample.service和 org.osgi.framework。
org.osgi.framework包中包含有OSGi框架类,比如,在HelloWorldBundle中的Activator.java中用 到的BundleContext和BundleActivator类都属于这个包。
2) 下面,请在Eclipse Java编辑器中打开com.javaworld.sample.helloworld.Activator.java,您会注意到,您现在可以访问 HelloService接口,但不能访问HelloServiceImpl实现类,这是因为HelloServiceBunlde只导出了 com.javaworld.sampel.service包,同时HelloWorldBundle也导入了这个包。HelloServiceImpl 是HelloServiceBundle的一个内部类,任何其它的Bundle都不能访问它。
4.3. 类级别上的访问域
如果您运行示例的HelloService服务包,它会在Eclipse控制台上打印出”HelloWorld”。但是,如果您想在 HelloWorld Bundle的Activator中访问HelloServiceImpl类,这时,编译没有问题,但在OSGi容器中运行这个Bundle时会抛出异 常。
OSGi容器是如何能将jar文件中的一些类隐藏掉,而让另外一些类可见呢?这是因为OSGi容器使用Java类加载器来管理类的可见性,OSGi 容器为每个Bundle创建不同的类加载器,因此每个Bundle能访问位于下列位置中的类:
a) 位于Java启动类路径下的、所有以Java.*开头的包中的类;
b) 位于OSGi框架类路径下的类,通常有一个独立的类加载器负责加载框架的实现类及关键的接口类;
c) 位于Bundle空间中的类,这些类通常包含在与Bundle相关的jar文件中,以及加到这个Bundle中的其它jar包中的类。
d) 导入包中的类,例如,HelloWorld Bundle导入了com.javaworld.sample.service包,因此它能访问该包中的类。Bundle级别的访问域是OSGi一个非常 强大的功能,例如,它可以让您安全地更新HelloServiceImpl.java类,而不必担心依赖于这个类的代码受到破坏。
以上就大概介绍了OSGi依赖性管理的概念。
发表评论
-
OSGi是什么:Java语言的动态模块系统
2010-05-31 14:19 646之前51CTO曾发过一篇文章叫做《OSGi为什么重要:向模块化 ... -
OSGi Bundle之Hello World
2010-05-31 14:20 697本文是《你 好,OSGi 》系列的第二部分。之前曾介绍过O ... -
OSGi服务:非常适合SOA的架构
2010-05-31 16:35 765本文是《你 好,OSGi 》系列的第四部分。下面讲述OSG ... -
OSGi和Spring入门:什么是Spring动态模型(Spring DM)?
2010-05-31 17:46 1036【51CTO精选译文】本文 ... -
OSGi与Spring:设置Spring DM开发环境
2010-06-01 09:46 633【51CTO精选译文】本文 ... -
使用Spring DM创建Hello World,以及OSGi服务
2010-06-01 13:24 772【51CTO精选译文】本文是《你好,OSGi 》系列的第 ... -
使用OSGi构建面向服务的联络管理应用程序
2010-06-01 14:44 724【51CTO精选译文】本文是《你好,OSGi 》系列的第 ... -
OSGi与Spring DM:使用Spring DataSource
2010-06-07 12:53 650【51CTO精选译文】本文是《你好,OSGi 》系列的第 ... -
初探OSGi Web应用开发利器Equinox:环境设置
2010-06-07 12:55 814【51CTO精选译文】在之前的《你好,OSGi》系列 中, ... -
打造一个Hello World OSGi Web应用程序
2010-06-07 12:59 567【51CTO精选译文】在《你好,OSGi 》的之前一篇文章 ... -
部署并运行你的OSGi Web应用程序
2010-06-07 13:02 440【51CTO精选译文】本文 ... -
打造一个基于OSGi的Web Application
2010-06-12 09:51 1195动机和目标 OSGi技术 ... -
OSGi中获取Service的几种方式
2010-06-12 10:01 755在OSGi中,Service是动态管理的,OSGi容器提供 ...
相关推荐
开发者需要清楚地定义bundle的依赖关系,合理地管理版本,利用OSGI框架提供的动态性,以实现高效、灵活的软件架构。通过深入研究像"org.salever.osgi.depends.clientbundle"和"org.salever.osgi.depends.hostbundle...
5. **服务生命周期管理**:Tomcat中的Servlet和Filter等Web组件可以通过OSGI服务来声明其依赖,这样在启动时,OSGI容器会自动管理它们的生命周期。 6. **性能和稳定性**:尽管OSGI提供了许多优势,但其动态性也可能...
3. **依赖管理**:OSGi框架自动处理bundle之间的依赖关系,确保依赖的bundle在需要时可用。 4. **版本控制**:支持多版本共存,同一个服务可以有多个版本同时存在,bundle可以选择使用哪个版本。 5. **安全**:OSGi...
在OSGi架构中,整个生命周期管理是十分重要的组成部分,它保证了应用能够动态地进行安装、启动、更新、停止和卸载,从而实现了应用模块的高度灵活性和可维护性。下面详细解释关于OSGi生命周期层的几个关键知识点: ...
通过Apache Felix这样的OSGI框架,开发者可以在IntelliJ IDEA这样的集成开发环境中方便地管理和调试这些bundle,从而提高了开发效率和代码的可维护性。在实际应用中,开发者可以根据需求组合不同的bundle,构建出...
3. **Bundle作为组件**:每个Bundle可以被视为独立的组件,它们之间通过OSGi服务注册表进行交互,实现动态的依赖管理和服务发现。 4. **使用脚本管理组件**:引入脚本语言,如JavaScript或Groovy,可以更灵活地管理...
总的来说,`org.osgi.core-4.2.0.jar` 提供了实现 OSGi 规范 4.2.0 版本的核心服务,包括模块化、依赖管理、服务注册、动态性、安全性和异常处理等关键功能。这些特性使得 OSGi 成为构建复杂、可维护、可扩展的 Java...
2. **依赖管理**:通过声明导入和导出包来管理依赖关系,确保bundle之间的正确协同工作。 3. **代码编写**:使用OSGi API编写bundle内的代码,实现服务注册和消费。 三、OSGi部署 1. **启动OSGi容器**:例如...
8. OSGi依赖关系管理:OSGi提供了一套依赖关系管理机制,它能够解析模块之间的依赖,并确保当模块被激活时,所有必要的依赖都被满足。 OSGi控制台部分介绍: 1. OSGi错误分析:提供了一种机制来分析和解决模块在...
OSGi(Open Service Gateway Initiative)是一种java模块化系统的构建专家,它提供了一个动态化的模块化系统,能够解决传统项目中的类加载器类冲突、jar包依赖性管理、包可见性管理和jar包版本管理等问题。...
4. **自动依赖管理**:Spring OSGi可以自动管理bundle之间的依赖关系,通过声明式服务(Declarative Services, DS)来声明服务和依赖,降低配置复杂性。 5. **集成其他Spring特性**:Spring OSGi支持Spring的AOP、...
3. **依赖性管理**:介绍OSGi框架如何管理和解决依赖关系。 4. **包可见性管理**:探讨如何通过OSGi来控制包的可见性,确保只有指定的包对外可见。 5. **版本管理**:解释OSGi如何处理不同版本间的兼容性问题,以及...
OSGI运行时环境(称为“framework”)管理这些bundle的生命周期,确保它们之间的依赖关系得到正确处理。OSGI使用服务注册和发现机制,允许组件之间通信,而无需硬编码依赖关系。 2. OSGI实战: 在实践中,OSGI被...
通过服务化组件之间的交互,OSGi不仅让组件能够更加灵活地应对变化,还简化了依赖关系的管理,提高了开发和维护的效率。对于需要高度模块化、动态更新和维护的应用程序,OSGi服务层是一个非常有价值的工具。
- **元数据管理**:bundle的MANIFEST.MF文件用于存储元数据,包括包导出、导入、版本信息等,这是OSGi依赖解析的关键。 4. OSGi规范: - **R4核心规范**:r4.core.pdf和r4.core(OSGi R4核心规范).pdf可能详细介绍...
在Java世界中,OSGi(Open Services Gateway Initiative)是一种模块化系统,它允许开发者创建可独立更新和依赖管理的模块,即Bundle。Eclipse的Equinox是实现OSGi规范的一个流行实现。这篇博文将深入探讨如何使用...
3. 依赖管理:OSGi容器负责管理Bundle间的依赖关系,避免类加载冲突,确保正确版本的类被加载。 二、Spring DM (Deployment Manager) 1. Spring DM是Spring对OSGi服务的扩展,提供了一种声明式的方式来管理OSGi ...
3. **模块化编程**:在OSGi中,每个bundle都是一个独立的模块,因此编程时需考虑模块间的依赖关系和隔离性。通过使用OSGi服务,bundle之间可以安全地通信,而无需直接引用彼此。 4. **OSGi框架**:运行OSGi应用需要...
**标题解析:** "blueprint-osgi-bundle:OSGi 示例" 指的是一个基于OSGi(Open Service Gateway Initiative)框架的示例项目,它使用了Blueprint服务容器来管理服务组件。Blueprint是Apache Felix项目中的一个子项目...