程序人生

在Java中摸爬滚打的日子

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  6 Posts :: 1 Stories :: 19 Comments :: 0 Trackbacks
概述:   
    接触OSGi已经有两三年了,而真正运用OSGi于项目之中,也将近两年。这两年来,因为OSGi的不太成熟也让我饱受历练。
    如果你对OSGi这个名词有点陌生,那本系列教程就不太适合你了,如果你想学习本系列教程,请你先去了解OSGi的相关概念。
    拽写本系列教程的目的在于给想要在企业应用中使用OSGi技术的同学朋友们以实际经验指导,希望能给你带来收获。
名词解释:
    OSGi:OSGi是Open Service Gateway Initiative的简称,可以称是一种技术,也可以称是一个平台,亦可称之为一种规范。
    Bundle:OSGi中最重要的元素之一,也是OSGi中最小的物理元素。它是一个jar包,但它持有一份能够进行自我描述的元数据文件(MANIFEST.MF),虽然普通的jar包中也存在有MANIFEST.MF文件,但非Bundle的jar的MANIFEST.MF文件中缺少进行自我描述的元数据信息。
    Equinox:OSGi的一个参考实现,也是Eclipse3.2+的核心。
    SSH脚手架:SSH脚手架是指由Struts+Spring+Hibernate组合在一起的开发框架。
    Spring-DM:Spring-DM是SpringDynamicModules的简称,是由SpringSource提供的,致力于整合Spring框架和OSGi平台的一个框架。
    Plug-in:这里的Plug-in指基于OSGi技术的插件工程。
    Maven:用来管理项目依赖及构建的一个脚本工具。
    EBR:这里的EBR是SpringSource提供的Enterprise Bundle Repository的简称
入门要求:
    学习本系列教程的同学需要了解SSH脚手架,熟悉Eclipse IDE开发,对Maven有一定的了解。
前期准备
    JDK1.6+
    Eclipse3.4+
    Spring2.5.6+
    Spring-DM1.1.2+
    Maven2.0.9+
    EBR访问地址:http://www.springsource.com/repository/app
需要解决的问题
    要使SSH脚手架能够正常运行于OSGi环境,那我们首先要解决的问题有三。其一是cglib的类加载器的改造,其二是解决数据库驱动包跟数据库连接池缺少依赖的问题,其三就是整理运行于OSGi环境下的SSH脚手架需要依赖的Bundle对象。
    也许有人会说,要让Java应用程序运行OSGi那有什么困难的呢?当然,解决问题的手段多种多样,但要创建一个标准的OSGi基于OSGi的应用程序,还确实不是那么的简单。
    解决了以上所说的三个问题,基于SSH开发OSGi应用就不成问题。但该如何解决以上三个问题呢,以及解决了以上三个问题后如何来规范这种基于OSGi环境下的SSH开发呢,又该如何保证开发效率能够保持在或更优于以往开发非OSGi应用时等一系列问题呢。要想了解如何解决,敬请关注本系列文章。


posted on 2010-06-15 00:17 潇湘振宇 阅读(5287) 评论(9)  编辑  收藏 所属分类: OSGi系列

Feedback

# re: 基于OSGi的Web应用开发系列一 2010-06-15 04:49 临远
呵呵,过来参拜一下使用spring-dm做项目的同志。还不清楚对cglib改造有什么用途,我们是使用暴力反射让hibernate实现动态注册实体类。spring基本已经被抛弃了。struts最后也没整合到osgi里,基本来说,改造以后系统已经不能通用了。期待博主的见解,多谢。  回复  更多评论
  

# re: 基于OSGi的Web应用开发系列一 2010-06-15 09:31 潇湘振宇
@临远
改造cglib的目的是为了正常使用Hibernate的延迟加载,Hibernate在创建代理的时候,因为OSGi的特殊性,每个Bundle拥有独立的一个ClassLoader(Fragment除外),cglib通过其AbstractClassGenerator.create方法创建对象时,先获取到相应的ClassLoader对象缓存起来,在延迟加载的时候再通过缓存起来的ClassLoader来加载指定的对象。但是cglib获取的默认ClassLoader对象是POJO所在的Bundle的ClassLoader对象,而通过此ClassLoader来加载HibernateProxy类,自然会出现NoClassDefFoundError之类的异常。这个问题在BlueDavy的OSGi进阶中有详细的说明。
在Hibernate这一层使用暴力反射让hibernate实现动态注册实体类这样的方法我觉得过于复杂,我觉得没必要这样做。我是通过Fragment来实现的。这样理解想来也容易。  回复  更多评论
  

# re: 基于OSGi的Web应用开发系列一(前言) 2010-06-15 12:15 晋哥哥
持续关注中  回复  更多评论
  

# re: 基于OSGi的Web应用开发系列一(前言) 2010-06-17 15:21 特立独行
持续关注中
请博主坚持更新哦~加油  回复  更多评论
  

# re: 基于OSGi的Web应用开发系列一(前言) 2010-06-17 15:26 潇湘振宇
多谢关注!昨天上午差不多完基于OSGi的Web应用开发系列三(构建项目框架),只是因为刚搬了家,而新租的房子那里还没有开通网络,需要过一两天才能发布!  回复  更多评论
  

# re: 基于OSGi的Web应用开发系列一(前言) 2010-06-19 16:35 Johnny.Liang
@潇湘振宇

支持原创  回复  更多评论
  

# re: 基于OSGi的Web应用开发系列一(前言) 2010-08-18 21:14 黄晨
如何通过fragment部署entity,还是不知道。Fragment和主bundle共用一个classloader.但是我创建了一个 hibernat bundle和一个DomainObject bundle. 在DomainObject bundle中有两个通过anotation定义的pojo: Test和User. 在hibernate bundle中我通过addAnnotatedClass添加这两个pojo.可是总是报错:Test cannot be resolved to a type 和 User cannot be resolved to a type。 即使我在Fragment中将两个pojo所在的包export,在hibernate bundle中import也没用。为什么加载不了pojo class呢?有什么需要注意的么?   回复  更多评论
  

# re: 基于OSGi的Web应用开发系列一(前言) 2010-08-20 09:26 潇湘振宇
@黄晨
这里需要注意的一点是,你在Hibernate Bundle中通过addAnnotatedClass添加这两个POJO,而这个是通过在SessionFactory Bean中配置,如果确定POJO的Bundle是Hibernate Bundle的Fragment的话,那应该是没问题的,但如果不是的话,那就需要确保在Hibernate Bundle的MANIFEST.MF文件中有Import-package这两个POJO所在的包。  回复  更多评论
  

# re: 基于OSGi的Web应用开发系列一(前言) 2015-07-06 17:34 Wick
经过几年的发展,目前OSGi已经成熟,很多公司开始使用,最著名的当属JIRA,国内的有JXADF(http://osgi.jxtech.net)。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: