- 浏览: 383102 次
- 性别:
- 来自: 北京
最新评论
-
liuzhongzhou2721:
不错啊
Snmp4j编程简介之三:Snmp -
ahong520:
我在Keystore.getInstance("JK ...
java实现 SSL双向认证 -
tanghanlin:
好吧,还是支持下
Snmp4j编程简介之三:Snmp -
sjp524617477:
mark
java实现 SSL双向认证 -
dikesky:
您好,看了您的这篇文章学到很多东西。希望您提供一个QQ号(发到 ...
httpclient笔记(二)
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依赖性管理的概念。
发表评论
-
OpenNMS® 安裝指南
2011-03-10 16:20 1853THIS DOCUMENT IS FOR OpeNNMS 1. ... -
OSGI学习笔记(二)
2010-09-09 11:03 1493开发一个简单的Hello World的OSGi Bundle( ... -
OSGI学习笔记(一)
2010-09-09 10:43 1167OSGi是什么 OSGi亦称做Java语言的动态模块系统,它 ... -
Javarebel小试
2010-09-07 16:49 33531 Javarebel简介 JavaRebel是一个JV ... -
240多个jQuery插件下载地址
2009-08-11 17:24 11985概述 jQuery 是继 prototype 之后又一个优秀 ... -
关于SNMP的RFC文档号
2009-05-04 16:10 4567一. SMIv1Full Standards: ... -
JavaCard CPU的设计与FPGA实现
2009-05-04 14:28 22051 JavaCard简介 智能 ... -
Java Card 技术(三)
2009-05-04 14:17 2615Java Card 应用程序的元素 请记住,Java ... -
Java Card 技术(二)
2009-05-04 14:13 2723本系列文章的第 1 部分介绍了 Java Card 技术的 ... -
Extjs学习笔记(一)
2008-12-15 13:39 1606下载extj :http://extjs.com/deploy ... -
ftp4j之FTP
2008-12-01 10:11 3711The ftp4j library implements a ... -
James学习笔记
2008-11-25 15:13 3376Apache James 简称 James, 是 Java ... -
非阻塞的Socket链接(来自老紫竹)
2008-11-25 11:10 1716import java.io.IOException; ... -
java实现 SSL双向认证
2008-11-24 16:36 31200实现技术:JSSE(Java Security Socket ... -
编码传说
2008-11-21 17:38 1305很久很久以前,有一群人,他们决定用8个可以开合的晶体管来 ... -
使用Log4j进行日志操作
2008-10-16 11:36 1120使用Log4j进行日志操作1. 概述1.1. 背景在应用程序中 ... -
linux 下cpu 内存 磁盘 jvm的使用监控
2008-07-24 13:50 2923java 监控linux CPU 内存 磁盘 JVM: imp ... -
snmp4j获取数据agent实例(三)
2008-07-03 11:43 6692agent代理端例子: import java.util. ... -
snmp4j获取数据实例(二)之SnmpTrap示例
2008-07-03 10:27 6593snmp4j的jar包可以在它的官方网站http://www. ... -
snmp4j获取数据实例(一,Linux SNMP OID’s for CPU,Memory a)
2008-07-03 09:10 9043常用SNMP OID Linux SNMP OID’s f ...
相关推荐
OSGI学习笔记
NULL 博文链接:https://abstractforever.iteye.com/blog/758879
NULL 博文链接:https://abstractforever.iteye.com/blog/761674
NULL 博文链接:https://abstractforever.iteye.com/blog/1126123
osgi学习资料
经典OSGI学习资料,OSGI,幸苦收集的。。感觉好不错
OSGi入门笔记
本人学习osgi karaf笔记,karaf常用命令
osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍
osgi原理与最佳实践,这是一本关于osgi学习的电子书籍,书籍是从网上找的,感谢前辈们无私地分享
OSGi学习不错的材料 OSGi学习不错的材料 OSGi学习不错的材料 OSGi学习不错的材料
NULL 博文链接:https://itway.iteye.com/blog/1545218
Linux OSGi的框架搭建,使用cvm来编译文件
osgi 规范osgi 规范osgi 规范osgi 规范osgi 规范osgi 规范osgi 规范osgi 规范osgi 规范osgi 规范osgi 规范
osgi学习之个人总结,这是个人学习OSGI时候的总结,这里有个人的理解,对于初学者有所帮助,可以少走弯路
java OSGi学习资料包教程
资源名称:OSGi相关框架学习资料资源目录:【】EclipseRCP与SpringOSGi技术详解与最佳实践【】osgi.core.javadoc-5.0.0【】OSGi_R4_Spec_zh_cn_origional【】OSGi原理与最佳实践【】OSGi原理与最佳实践的源码【】...
OSGI 插件开发框架 或许在国内的你还在使用SSH,因为那个东西给你带来了便利,可是在国外却已经很流行OSGI这种插件开发框架,应为它真的很强大而且很好学,据本人估计在不久的将来该技术 同样会在国内流行。