OSChina 第 33 期高手问答 —— OSGi 以及 Equinox

红薯 发布于 2013/03/24 10:45
阅读 9K+
收藏 27
OSCHINA 本期高手问答我们请来了 @谢小明 为大家解答关于 OSGi 以及 Equinox 开发方面的问题。

谢小明,《深入理解OSGi:Equinox原理、应用与最佳实践》一书的作者。资深Java技术专家,具有丰富的JavaEE企业级应用开发开发经验,对OSGi、Spring、Hibernate等技术和框架有比较深入的研 究和认识。喜欢钻研运行于JVM之上的其他语言,如Scala和Clojure等。现任远光软件股份有限公司平台开发部平台架构师,先后参加与过国家电 网、南方电网等多个国家级大型ERP项目的平台架构工作。

为了鼓励大家踊跃提问,我们为大家准备了 5 本“ 深入理解OSGi:Equinox原理、应用与最佳实践”作为奖品,在问答结束后由 @华章 从提问者中随意抽取5名幸运的朋友。

OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家就 OSGi 开发方面的问题向 @谢小明 提问,请直接回帖提问。

加载中
0
邓华锋
邓华锋
@谢小明 : 对于Web项目加入OSGI有什么看法吗?可行性好不?有人说WEB中加入OSGI华而不实。
谢小明
谢小明
web应用中引入OSGi确实会增加整个系统的复杂度,如果是简单的web应用,引入了OSGi确实会有华而不实的感觉,怎么权衡是否使用OSGi,看看这篇文章,或许能给你一些答案:http://www.programmer.com.cn/15563/
0
缪斯的情人
缪斯的情人
@谢小明 :OSGI在web应用中一直没有看到很有成效的典型,淘宝据说在用(推测可能在服务端),在web应用中的复杂点可能是一些页面接口对外需要暴露,这一点无疑增加了开发和架构的复杂度,尤其是在动态组件模式中,请问在实践中是如何处理这方面问题的?
小骏骏
小骏骏
回复 @谢小明 : 那评判代码写得好与坏的标准是什么?有什么可依的?
谢小明
谢小明
引入OSGi核心的价值是模块化,以及模块化带来的动态性,系统能热部署、更新。动态组件在实践过程中,需要合理的编码(参考书中通用实践章节),也需要有自动化、回归、稳定性测试来支撑,将动态性作为测试的要点之一。系统动态性没有经过测试,直接在生产环境使用是危险的,很可能否写代码编写不合理,导致系统的内存溢出、资源泄漏的。
0
邓华锋
邓华锋
@谢小明 : 怎么让OSGI在一个web app内部运行?
Y
YeWei
Virgo本身就是一个集成了OSGi的Web容器。这里有一篇文章介绍Virgo,http://osgi.com.cn/article/7289227
谢小明
谢小明
OSGi运行在web app可以使用servletbridge桥接模式,书中有章节深入代码级别讲解此模式,使用equinox的一个bridge项目做的。
0
缪斯的情人
缪斯的情人
@谢小明 :目前也了解到有个别公司用osgi作web组件化应用,主要是看到了它的热插拔特性,但是实现方式貌似很复杂,增加了系统本身的复杂性,前端界面部分也是应用的基于java语言GWT实现的,如vaadin。权衡一下,如果只是单纯追求热部署那可以通过jetty变相实现,web应用osgi这样做是否值得提倡?淘宝主要是哪一块应用了osgi?(据说osgi最早引入者林昊在淘宝负责这块)
谢小明
谢小明
web前端使用GWT是项目组人员的技术组成决定的,我认为好的js开发人员比java开发人员更难遇到,如果团队有js的好手肯定不喜欢用GWT的。GWT对于纯Java开发人员确实是个好技术,但从个人成长和团队技能培养来看,成员会js也是必须的,我认为js的就业前景也不一定比java差的
谢小明
谢小明
web应用是否引入OSGi和其使用什么前端技术没有关系,http://www.programmer.com.cn/15563/ 这里的四问可以给你提供一些启发。如果web应用不是特别复杂,我也不建议强行引入OSGi,不能为了技术而去做项目的。 你说的jetty变相实现可否给予一些分享? 淘宝目前使用OSGi具体细节的我也不清楚~
谢小明
谢小明
单纯为了灵活性热部署等技术追求而是用OSGi是不明智的。我认为OSGi的核心价值在于模块化(有了模块化,以Bunlde为粒度的动态性才有了可能),对于大型应用系统、或者做平台的系统,特别有意义,目前我接触过的系统,Bundle数量就到达了四五百个,尤其企业应用、若干人员协同开发的更为适合。
0
海空
海空
@谢小明 :osgi感觉很好.我们曾经用osgi+sca 搞了个中间件,组件化开发,还带bpm,当时引入osgi也就是为了热插拔,动态部署. 实际到最后应用的时候,我们发现没有什么地方,非要热插拔.轮流重启更稳定,反正复杂的包依赖,jar包版本不同,稀缺的文档,给团队带来很多麻烦,最后我们就阉割这个项目. osgi真的有这样好吗,一定需要osgi吗?
海空
海空
回复 @谢小明 : 确实弊大于利.连spring都不升级了.
谢小明
谢小明
OSGi的核心是模块化,调用者和实现完全隔离,模块化带来了更好的管理,有效的隔离等好处,也带来了动态性。如果系统对这方面没有特别强制的需求(做平台和中间件的就有模块化的强烈要求),团队OSGi能力一般的情况下,不建议盲目追求实用,目前对于很多的web应用、企业应用OSGi不是一定需要的。
谢小明
谢小明
OSGi用来做中间件、平台是非常适合的,websphere从6.1版本开始就是基于Equinox构建的,目前也越来越多中间件、web容器都基于OSGi的。OSGi确实给系统带来了更多的复杂度,驾驭是弊大于利的。
0
海空
海空
@谢小明 :打听下,听说国家电网有个基于osgi的平台了?是真的吗?
谢小明
谢小明
国家电网的技术平台是基于OSGi的
0
震秦
震秦

@谢小明 :您好,我关注OSGI也很久,一直在考虑的可用性. 读过Manning 出版社<<OSGI实战>>中文版. 我现在的疑问是:用OSGI开发会不会导致开发难度加大?

比如在Eclipse中运行OSGI程序还很麻烦, 其他开发环境或者支持的不是很好, 请问有没有什么办法? 大项目中你们是怎么解决依赖的, 还有开发调试问题?

奋斗一生
奋斗一生
太有用了 写了 正愁不知道怎么做呢
谢小明
谢小明
大项目中依赖关系有大致有两种解决办法。1.基于eclipse作为plugin透视图作为开发,eclipse对于OSGi的开发支持的非常好,能自动分析依赖关系等。2.项目基于Maven开发,使用pom管理bundle之间的依赖关系,然后结合bnd、spring bundlor工具自动生成MANIFEST.mf中OSGi的import、export等信息
谢小明
谢小明
web容器嵌入内OSGi,基于eclipse开发OSGi应用,运行OSGi我觉得还是比较简单的,eclipse就有OSGi FrameWork的应用,勾选自己要启动的bundle,然后点击Add Required Bunldes,run/debug即可。 OSGi嵌入Servlet容器,使用桥接项目,则使用web容器类似tomcat就可以运行调试。
海空
海空
可以看看 这个 mvn插件 pax-construt 可以pax-add-repository pax-import-bundle pax-create-bundle pax-wrap-jar 使用mvn启动端口,使用远程调试 挂接
0
golang
golang

@谢小明 :你好,我们公司现在就正在使用OSGI框架进行开发,但是目前遇到几个问题想咨询你一下。

1:OSGI跟JPA结合的时候,所有entity类都必须放在跟persistent.xml在同一个bundle中,如果放在不同的bundle中,就报错说找不到对应的实体类。请问你遇到过这个问题吗?

2:OSGI自动编译打包请问你们用的是什么技术?是用maven吗?有结合用到hudson打包完之后直接上传到服务器吗?

3:建议:能建立一个osgi的群吗?我们可以跟其他朋友相互探讨学习。

在此谢谢您能够在百忙之中帮我们解答,谢谢!


谢小明
谢小明
打包这方面使用ant,maven都可以,集成持续集成也是没有问题的。主要是OSGi的依赖关系要维护好。推荐使用maven管理,然后使用bnd,bundlor等转化为标准的OSGi,国外不少的OSGi项目也是如此操作的。如果基于eclispe的,可以使用eclipse的方式使用。
谢小明
谢小明
OSGi和JPA集成可以参考书中的企业开发章节,有比较深入的描述,大方向上是单个Persistence Unit还是多个的问题。OSGi的企业规范是一个Persistence Bundle一个Unit。你问题1的报错是想系统单个Persistence Unit加载全部的实体,这样会面临如果有动态性需求,导致更新的实体Persistence Unit状态的问题。
0
T
TT牛
@谢小明 :我总是认为基于JVM的程序,不够快,虽然官方说快,到底是不是足够快呢,这是我的疑惑之一。再有就是,为什么C++这么好的语言,不能最多的广泛使用,如果说C++确实存在一些问题,那为什么我们不一起改进它呢。第三就是,Go语言这种,谷歌最近的行为弄得人心惶惶的,都不敢去接触它了,甚至是安卓,哪一天谷歌采用自家语言了,我认为Java中落的那天也就不远了,你认为基于JVM的语言,还能活得长久吗?
f
fxysun
现在是硬件性能过剩的年代, 不需要那么快
谢小明
谢小明
jvm上面的语言应该还是可以存活很久的
0
golang
golang

@谢小明 :不好意思,刚才问题还没有提完,

1:我们在aix系统上面运行OSGI东西的时候,总是一段时间之后会出现内存溢出的情况。也不知道从哪里下手分析这个,能否给出一些建议。

2:我们在使用spring的时候,同时使用其他的jar包也是一样。在每一个bundle中都要加入相应的jar,不然引用时就会有异常:ClassNotFoundException。这个jar包共享在多个bundle上面能否给出合适的例子?

万分感谢!

谢小明
谢小明
spring等第三方包最好可以独立出来,放在某个Bundle的Bunlde-Classpath不合适。如果你是想OSGi集成Spring,使用Spring DM会平滑很多
golang
golang
在创建spring的context的时候,应该怎么写(在B_bundler里面): new GenericXmlApplicationContext("classpath*:applicationContext.xml"); 谢谢,给你添麻烦了
golang
golang
谢谢您的解答: 关于第二个问题:我们是这样做的:A_Bundle里面放了相关的spring的jar包,例如:spring-context-3.0.6.RELEASE.jar等包。让后导出供B_Bundle使用。但是在B的里面使用spring加载B bundle的applicationContext.xml(spring配置文件)时候就会提示加载不了。不知道我这种做法是否可取! 谢谢!
谢小明
谢小明
1.内存溢出后分析Heap Dump文件,使用工具:IBM eadpAnalyzer、MemoryAnalyzer就能分析出溢出根源。2.不太明白你的意思,我猜测你想要达到的效果可否单独将一个BundleA加入下面信息org.sp ringframework;visibility:=reexport,其他依赖了BundleA的就自动依赖spring了,reexport可以满足你的要求
返回顶部
顶部