OSGi里面的bundle在开发中细分出模块间的边界,但是你如果遇到框架的时候有点麻烦,springDM就是一个典型,下载spring-osgi启动里面的demo大约有50多个bundle,甚至更多。当你基于springDM开发bundle的时候,你会发现你需要引入的太多,加上commom包,估计一个简单的bundle也要引入10多个包或者bundle,对于项目组开发要求太高。
如何简化呢?看看OSGi的类型加载机制你会发现这样一个参数org.osgi.framework.bootdelegation,org.osgi.framework.bootdelegation主要是定义是否采用父类加载器加载里面配置的类,bootdelegation可是支持通配符的哦,这样有了一个想法,对于spring框架和common包我们不需要引入bunlde了,直接让父类加载器去完成只需要配置org.apache.*,org.springframework.*即可,当加载的时候遇到apache和springframework的时候都是让父类加载器去加载即可。
父类加载器在OSGI里面可以采用osgi.parentClassloader去控制,默认是boot,不建议使用基本只能加载jre下面的几个jar,功能不够强大,可以采用ext或者app,我建议使用ext,自己定义java.ext.dirs的目录,这样只要jar包在此目录下即可以加载,至于app只要在你的classpath里面也行,但是不如ext那么方便。
经过试验通过OSGi+springDM+tomcat启动最少只需5个bundle(2个eclipse的,1个tomcat启动bundle,2个spring的extender)
如何简化呢?看看OSGi的类型加载机制你会发现这样一个参数org.osgi.framework.bootdelegation,org.osgi.framework.bootdelegation主要是定义是否采用父类加载器加载里面配置的类,bootdelegation可是支持通配符的哦,这样有了一个想法,对于spring框架和common包我们不需要引入bunlde了,直接让父类加载器去完成只需要配置org.apache.*,org.springframework.*即可,当加载的时候遇到apache和springframework的时候都是让父类加载器去加载即可。
父类加载器在OSGI里面可以采用osgi.parentClassloader去控制,默认是boot,不建议使用基本只能加载jre下面的几个jar,功能不够强大,可以采用ext或者app,我建议使用ext,自己定义java.ext.dirs的目录,这样只要jar包在此目录下即可以加载,至于app只要在你的classpath里面也行,但是不如ext那么方便。
经过试验通过OSGi+springDM+tomcat启动最少只需5个bundle(2个eclipse的,1个tomcat启动bundle,2个spring的extender)