- 浏览: 1149508 次
- 性别:
- 来自: 火星郊区
博客专栏
-
OSGi
浏览量:0
文章分类
- 全部博客 (695)
- 项目管理 (48)
- OSGi (122)
- java (79)
- Vaadin (5)
- RAP (47)
- mysql (40)
- Maven (22)
- SVN (8)
- 孔雀鱼 (10)
- hibernate (9)
- spring (10)
- css (3)
- 年审 (6)
- ant (1)
- jdbc (3)
- FusionCharts (2)
- struts (4)
- 决策分析 (2)
- 生活 (10)
- 架构设计 (5)
- 破解 (2)
- 狼文化 (4)
- JVM (14)
- J2EE (1)
- 应用服务器 (1)
- 我的链接 (5)
- 数学 (2)
- 报表 (1)
- 百科 (6)
- Flex (7)
- log4j (2)
- PHP (1)
- 系统 (2)
- Web前端 (7)
- linux (6)
- Office (1)
- 安全管理 (5)
- python (2)
- dom4j (1)
- 工作流 (3)
- 养生保健 (4)
- Eclipse (8)
- 监控开发 (1)
- 设计 (3)
- CAS (1)
- ZK (41)
- BluePrint (3)
- 工具 (1)
- SWT (7)
- google (2)
- NIO (1)
- 企业文化 (2)
- Windoes (0)
- RCP (7)
- JavaScript (10)
- UML (1)
- 产品经理 (2)
- Velocity (10)
- C (1)
- 单元测试 (1)
- 设计模式 (2)
- 系统分析师 (2)
- 架构 (4)
- 面试 (2)
- 代码走查 (1)
- MongoDB (1)
- 企业流程优化 (1)
- 模式 (1)
- EJB (1)
- Jetty (1)
- Git (13)
- IPV6 (1)
- JQuery (8)
- SSH (1)
- mybatis (10)
- SiteMesh (2)
- JSTL (1)
- veloctiy (1)
- Spring MVC (1)
- struts2 (3)
- Servlet (1)
- 权限管理 (1)
- Java Mina (1)
- java 系统信息 (6)
- OSGi 基础 (3)
- html (1)
- spring--security (6)
- HTML5 (1)
- java爬虫搜索 (1)
- mvc (3)
最新评论
-
Tom.X:
http://osgia.com/
将web容器置于OSGi框架下进行web应用的开发 -
chenyuguxing:
你好, 为什么我的bundle export到felix工程中 ...
在Apache Felix中运行bundle -
string2020:
<niceManifest>true</ni ...
Bundle Plugin for Maven -
jsonmong:
OSGI,是未来的主流,目前已相当成熟。应用OSGI比较好的, ...
基于OSGi的声明式服务 -
zyhui98:
貌似是翻译过来的,有很少人在linux上做开发吧
如何成为“10倍效率”开发者
osgi一个最大的特色就是使用不同的ClassLoader,让多个bundle共享一个虚拟机,而每一个bundle使用单独的ClassLoader。
如下图所示:
对于资源和类的装载主要包括以下三种途径:
Boot classpath:启动类环境,包括java.*包和相应的实现包。
Framework classpath:osgi框架拥有一个独立的ClassLoader,用于装载框架接口类,以及相应的实现类。
Bundle Space:每个bundle包括了与bundle相关的jar文件,以及相关的资源。
对于一个类的查询,主要通过以下途径进行查询:
1.从Parent ClassLoader中装载
2.从Import Package中查询类路径。
3.从Required bundles中查询类
4.自身bundle,相关ClassPath
5.相关的插件片段Fragment。
如下图
这么说起来,还是比较的抽象,还是从一个实例来具体的分析。
假设有如下Bundle,
相关的描述文件如下:
- Bundle:org.zframework.core
- Manifest-Version: 1.0
- Bundle-Name: core
- Bundle-SymbolicName: org.zframework.core;singleton:=true
- Bundle-ClassPath: .
- Import-Package: net.sf.ehcache;version="1.3.0" ,
- net.sf.ehcache.config;version="1.3.0" ,
- net.sf.ehcache.event;version="1.3.0" ,
- org.osgi.framework;version="1.4.0" ,
- org.osgi.service.log;version="1.3.0" ,
- ...
- Require-Bundle: org.eclipse.equinox.common;visibility:=reexport,
- ...
- Export-Package: org.zframework.core;version="1.0.0" ,
- ...
Bundle:org.zframework.core Manifest-Version: 1.0 Bundle-Name: core Bundle-SymbolicName: org.zframework.core;singleton:=true Bundle-ClassPath: . Import-Package: net.sf.ehcache;version="1.3.0", net.sf.ehcache.config;version="1.3.0", net.sf.ehcache.event;version="1.3.0", org.osgi.framework;version="1.4.0", org.osgi.service.log;version="1.3.0", ... Require-Bundle: org.eclipse.equinox.common;visibility:=reexport, ... Export-Package: org.zframework.core;version="1.0.0", ...
现在创建了如下的类:
- package org.zframework.core;
- import java.net.URL;
- import java.util.Collection;
- import net.sf.ehcache.Cache;
- import net.sf.ehcache.CacheManager;
- import net.sf.ehcache.Element;
- import org.osgi.framework.BundleContext;
- public class EhCacheManager extends AbstractCacheManager implements
- BundleContextAware {
- private String cacheFile;
- private BundleContext context;
- private CacheManager manager;
- public Cache getCache(String cacheName) {
- Cache cache = manager.getCache(cacheName);
- if (cache == null ) {
- ...
- }
- return cache;
- }
- ...
- }
package org.zframework.core; import java.net.URL; import java.util.Collection; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; import org.osgi.framework.BundleContext; public class EhCacheManager extends AbstractCacheManager implements BundleContextAware { private String cacheFile; private BundleContext context; private CacheManager manager; public Cache getCache(String cacheName) { Cache cache = manager.getCache(cacheName); if (cache == null) { ... } return cache; } ... }
假设有一个Bundle org.zframework.model需要使用此类,描述如下:
- Manifest-Version: 1.0
- Bundle-Name: model
- Bundle-SymbolicName: org.zframework.model;singleton:=true
- Bundle-ClassPath: .
- Import-Package: javax.persistence;version="1.0.0" ,
- javax.persistence.spi;version="1.0.0" ,
- org.osgi.framework;version="1.4.0" ,
- ...
- Require-Bundle: org.zframework.core
- 类Model
- package org.zframework.model;
- import java.net.URL;
- import java.util.Collection;
- import org.zframework.core.EhCacheManager ;
- public class Model{
- private EhCacheManager manager;
- public Object getCache(String key) {
- Object o = manager.getCache(key);
- return o;
- }
- ...
- }
Manifest-Version: 1.0 Bundle-Name: model Bundle-SymbolicName: org.zframework.model;singleton:=true Bundle-ClassPath: . Import-Package: javax.persistence;version="1.0.0", javax.persistence.spi;version="1.0.0", org.osgi.framework;version="1.4.0", ... Require-Bundle: org.zframework.core 类Model package org.zframework.model; import java.net.URL; import java.util.Collection; import org.zframework.core.EhCacheManager ; public class Model{ private EhCacheManager manager; public Object getCache(String key) { Object o = manager.getCache(key); return o; } ... }
下面简单说明一下装载过程:
在装载Model类时,
1.对于java.*类的装载,由相应的Boot ClassLoader 装载
2.装载EhCacheManager,
1.在Import-Package中查询是否存在匹配中的org.zframework.core包声明,如果有,则委派给org.zframework.core包声明的Bundle进行装载,本例没有,则继续。
2.在Require-Bundle中查询所有的Export声明包,判断是否存在org.zframework.core匹配。本例中,应该存在。如果不存在,则执行步骤2.3
3.查询本bundle的类路径,是否有此类存在。不存在,继续2.4步骤
4.查询所有的fragments bundle(特殊的bundle) 类路径。不存在,继续2.5步骤
5.判断是否使用DynamicImport-Package: * 声明,如果是则查询所有的bundle中声明的Export包。如果还是不存在,则抛出ClassNotFound例外。
关于DynamicImport-Package: * ,这是比较极端的设置,一般不会推荐使用,主要破坏了相关的封装性。
完整的类查询如下图:
关于类装载机制基本就是这些,对于初学者来说,这还是会有些困惑的。
发表评论
-
关于Felix Log Service
2012-12-07 16:44 1567OSGi服务纲要规范中定义了服务于OSGi平台的通用日志服 ... -
Maven 3 Felix 4 Eclipse 的搭建与部署(部分转载自别人文章)
2012-10-18 10:24 20334.1.开发环境搭建 4.2开发工具 Maven 3 F ... -
【绝对路径】OSGi环境中获取Plugin/Bundle中文件资源的绝对路径
2012-10-08 10:53 2492摘要:在进行Eclipse RCP开发的过程中,需要使用一 ... -
OpenCore:基于OSGi开发纯插件体系结构的WEB应用程序
2012-09-21 17:46 1423随着OSGi/Equinox逐渐成为Java EE服务端的基础 ... -
OSGi技术在Java Web开发中的应用
2012-09-20 11:26 1411随着 Java SE 对模块化功能原生支持的一再推迟(据最 ... -
OSGI典型的应用案例
2012-09-20 11:26 1634OSGI典型的应用案例主要有两个:分别是Eclipse和BMW ... -
OSGi特点
2012-09-20 11:26 12491、JRE版本无关性。虽然Java一直被人们认为是“Write ... -
OSGI与JMX 的关系
2012-09-19 17:09 1058不过重点是: JMX 本来设计的用途就只为了管理,我们不 ... -
在equinox环境开发web应用的"利器" -- registerResources()方法 详解
2012-09-19 17:07 1228registerResources()方法详解 1、简介 ... -
在equinox环境开发web应用的"利器" -- 序
2012-09-19 17:05 1363在equinox环境中开发web应用必须要借助一些工具包提供的 ... -
equinox环境下web应用资源的部署
2012-09-19 17:04 1307osgi的equinox实现环境下,web服务器和web应用都 ... -
OSGi产生的背景--在繁荣的混乱之中走出困惑
2012-09-19 16:58 1165软件的复杂性正在以惊 ... -
将web容器置于OSGi框架下进行web应用的开发
2012-09-16 14:26 3539将web容器置于OSGi框架下,其实就是将web容器做成OSG ... -
在Eclipse中开发OSGi Bundle
2012-09-16 14:26 1330Eclipse为开发OSGI Bundle提供了良好的支持,它 ... -
【第一代服务注册形式】 - 将一个Bundle注册为服务
2012-09-14 10:09 11551、创建业务接口类及其实现类 Java代码 ... -
Declarative Services规范简介及应用
2012-09-14 10:08 1421Declarative Services 是一 ... -
用FileInstall管理Bundle的动态安装、启动、卸载
2012-09-14 10:07 13331、文件目录如下: F:\study_osgi ... -
服务工厂 - Bundle消费者返回不同的服务对象
2012-09-14 10:03 1207一般情况下,服务对象在注册后,任何其它的Bundle在请求 ... -
服务跟踪(ServiceTracker)
2012-09-14 09:58 1159当多个Bundle使用同一 ... -
OSGi容器中Bundle之间Synchronous Communication
2012-09-11 17:07 1560OSGi Core定义了一个服务层,提供了一个Bundl ...
相关推荐
在本入门资料中,我们将探讨OSGI的关键概念、优势以及如何通过实战和最佳实践来掌握它。 1. OSGI原理: OSGI的核心在于它的模块系统,称为“bundle”。一个bundle是一个自包含的Java模块,包含了类、资源和元数据...
2. **动态性**:OSGi提供了完整的交互机制,管理Bundle和服务的生命周期,允许系统在运行时动态地改变行为,增强了系统的灵活性和适应性。 3. **SOA兼容性**:OSGi遵循面向服务的架构(SOA)原则,创建规范且可重用...
标题"OSGI入门和例子"意味着我们将探讨OSGI的基本概念以及如何通过实例来学习和理解这个框架。下面,我们将深入讨论OSGI的关键知识点: 1. **模块系统**:OSGI的核心是模块化,它定义了一种基于Java导出和导入包的...
OSGi的入门资料,网上找的,初探OSGi 的全文
学习OSGI入门和整合Spring,对于开发复杂的企业级应用,或者想要提升系统灵活性和可维护性的开发者来说,是非常有价值的。通过理解OSGI的模块化机制和Spring的依赖注入原理,可以构建出更加高效和可扩展的Java应用。
- **依赖管理**:OSGi 的版本管理和依赖解析机制能有效解决类路径冲突问题。 - **灵活性**:Spring OSGi 可以与现有的 Spring 应用集成,同时利用 OSGi 的优势,提高应用程序的灵活性和可扩展性。 3. **开始使用 ...
1. **Spring与OSGI集成原理**:Spring的bean管理如何与OSGI服务机制相结合,实现更灵活的依赖注入。 2. **Declarative Services(DS)**:利用OSGI的DS注解声明服务,简化Spring配置。 3. **Blueprint**:Spring的...
- **导出OSGi服务:**可以将普通的Spring Bean导出为OSGi服务,示例中`<osgi:service>`元素定义了服务的实现类和服务接口。 #### 五、导出OSGi服务 - **将普通Spring Bean导出为OSGi服务:**如上所示,通过`<osgi:...
1. **模块系统**:OSGi的核心是模块化,每个模块称为一个Bundle,它包含类、资源和元数据。Bundle之间通过导出和导入包来实现依赖关系。 2. **生命周期管理**:OSGi Bundle有启动、停止、安装、更新和卸载等状态,...
三、Spring OSGi 入门步骤 1. 安装OSGi容器:首先,你需要一个支持Spring OSGi的OSGi容器,如Apache Felix或Equinox。这些容器提供了运行Spring OSGi应用的基础环境。 2. 创建Spring OSGi Bundle:使用Spring的...
很基础全面的OSGI ppt教程,讲解的很详细。
### OSGi 入门与实践 #### OSGi 的历史背景 OSGi,全称为 Open Service Gateway Initiative,从字面上理解,它最初被设计为一个面向服务的平台。1999 年,OSGi 联盟成立,旨在为通过网络向设备提供服务建立开放的...
OSGi的核心是其模块系统,即Bundle,每个Bundle都是一个独立的、自我包含的代码单元,有自己的类加载器。 《OSGi实战》这本书可能涵盖了如何在实际项目中应用OSGi技术,包括Bundle的创建、服务的注册和发现、依赖...
探索 OSGi 框架的组件运行机制探索 OSGi 框架的组件运行机制
在OSGi框架中,服务层是位于应用程序之上的一层,它为服务提供者和消费者之间的交互提供了一种机制。这一层的主要目的是实现组件之间的松耦合通信,即组件不需要知道彼此的具体实现细节,仅通过服务接口进行通信。 ...
关于SOA中热门技术OSGI的入门样例的经典版本,供对需要进行ERP设计和学习的入门读者使用的经典
在OSGi入门篇:模块层这篇文章中,作者静默虚空深入探讨了OSGi框架中模块层的基础知识以及设计模块层时OSGi联盟所做的考虑。OSGi模块层是框架中最基础的部分,它实现了Java的模块化特性,但又与Java现有的模块化特性...