CXF-DOSGI整合问题的处理

本文介绍在struts2+felix+spring-DM+Hibernate环境下使用CXF-DOSGI单包模式遇到的问题及解决方案,包括解决启动速度慢、Spring冲突等问题。

   1、 前提:

     1)我们当前的运行环境是:struts2+felix1.41+spring-DM1.1.3+Hibernate,其中DAO层,是对Hibernate单独封装的包。felix和Struts2的整合网上资料很多其运行原理是:struts插件启动felix(或者说是嵌入式felix,这个可以看felix相关的文档)。

     2)CXF-DOSGI1.0有两种模式,单包模式和多包模式。单包模式中,所有CXF-DOSGI依赖的包都放在这个独立Bundle的CLASSPATH下。所有的启动都是该单独包的Activator来启动(名字是:AggregatedActivator)。而多包则是,所有的依赖包都以单独Bundle的形式存在。单包的优势是:包的数量少,不会将一些其他Bundle不需要的Bundle发布出去。缺点是:在我们这个环境中,由于本身已经存在了Spring-DM,而单包里将Spring-DM封装在自己的CLASSPATH中,这个在服务器启动时会报Spring的错,是在refresh方法时报的该错误,让人很是不爽啊!发火而多包我在和系统整合的过程中遇到了不少问题,首先是"javax.servlet"2.5版本的问题,这个通过将servlet2.5的包放在需要该package的Bundle下,主要是cxf-dosgi-ri-dsw-cxf-1.0.jar、cxf-bundle-minimal-2.2.1.jar,然后修改其MANIFEST.MF文件,不导入javax.servlet包。但是之后又引起JAXB的问题,由于时间问题,我没有再继续搞下去。最后采用了将单包中的Spring-DM相关包清除出该单包的思路解决了。具体如下:

   2、问题:

     1)加入CXF-DOSGI单包cxf-dosgi-ri-singlebundle-distribution-1.0.jar后系统启动特别慢。
           分析:
           1)设置web.xml文件中struts.osgi.logLevel属性为4,这样就会将所有信息都打印出来(这个有兴趣可以看felix和strut整合相关的文档)。
           2)在其中会出现类似于:DEBUG: Constraint violation for 15.0 detected; module can see javax.xml.bind.annotation.adapters from [0] and javax.xml.
                           bind.annotation.adapters from [23.0]的信息,则说明在第0个Bundle和第23个Bundle都导出了这个javax.xml.bind.annotation.adapters而导致冲突的问题。

          解决办法:将felix的配置文件从org.apache.felix.main-1.4.1.jar拷贝出来,放在系统开发环境的src下,然后将其中JDK1.6导的javax.xml.bind.annotation.adapters去掉即可。具体要结合你使用的JDK版本。

     2)Spring冲突的问题,具体错误已经忘记了。总之意思是:在执行reflesh时报说ApplicationContext容器已经关闭之类的。在Tomcat启动时,或者单独启动该Bundle时报错误。

          分析:这个问题很明显是该单包内部的Spring包和外部的Sping-DM的Bundle相冲突。
          解决办法:
         1)升级Spring-DM,由于后边cxf-dosgi-ri-singlebundle-distribution-1.0.jar使用的最低版本的Spring-DM是1.2,而且我们环境是Spring-DM是1.1.3。将其中的spring-osgi-io-1.1.3.jar、spring-osgi-extender-1.1.3.jar、spring-osgi-core-1.1.3.jar替换为1.2.0版本即可,当然了,捎带也把spring-osgi-web-1.1.3.jar也给升级成1.2。当然了这里要注意和其他Spring包相匹配才行,这个一定要注意。
         2)去掉cxf-dosgi-ri-singlebundle-distribution-1.0.jar中的spring-osgi-io-1.2.0.jar、spring-osgi-extender-1.2.0.jar、spring-osgi-core-1.2.0.jar、spring-context-2.5.6.jar、spring-beans-2.5.6.jar、spring-aop-2.5.6.jar这几个和Spring-DM相关的jar包。
         3)修改MANIFEST.MF文件文件中Bundle-ClassPath选项对这几个包的引入。
         4)修改MANIFEST.MF文件,将这几个包以Bundle的形式引入。

    3)做好了第2步之后发现,在tomcat启动时还有一个类org.springframework.osgi.extender.internal.activator.ContextLoaderListener类找不到的问题。

          分析:通过查看控制台报错,知道是在该单包启的AggregatedActivator中报的错误。打开该Activator源码查看,发现是因为在加载这个类时找不到。原因是在单包情况下是从该Bundle的CLASSPATH下去找的,这样当然能找到。而现在所有的Spring-DM相关的东西都是以Bundle形式引入进来的(上边已经说了)。而这个Activator所在的package在Spring-DM的spring-osig-extender-1.2.0.jar中并没有export该package。再仔细查看源码,发现是从cxf-dosgi-ri-singlebundle-distribution-1.0.jar的CLASSPATH下加载一个叫activators.list的文件来完成的,所有要加载的Activator都配置在这个文件中。
          解决办法:
          问题分析完了,解决就很容易了,找到这个文件,删除org.springframework.osgi.extender.internal.activator.ContextLoaderListener这个配置即可。重启服务器,查看webservice的wsdl地址,发布成功,测试通过,至此所有的问题解决完毕。

         总结:在解决问题时,我个人认为思路分为两种:一种是战略性的,一种是战术性的。像上边不再钻多Bundle的模式的牛角,而采用单Bundle的形式,而且略加改造的思路就是战略性的。而每个小问题的分析则是战术性的。有的时候,我们陷入泥潭时,不妨换个思路,也许就会柳暗花明。好了,OSGI的知识本身就少,而CXF-DOSGI的使用例子虽然不少,但是都在在单纯的OSGI容器中运行,而像我们这种嵌入式的情况,则会让环境更加复杂。解决这个问题后,先公布下自己的解决办法,希望能给各位网友起到抛砖引玉的作用。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值