`
linliangyi2007
  • 浏览: 1013209 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

讨论:关于OSGi Based 应用服务器

阅读更多
目前本人所知的只有IBM ,BEA等有商用版的OSGi Based 应用服务器,谁有的,Free一下啊

传说Jboss也在进行式中,不清楚何时能见到社区版的

要是web应用能搭载在OSGi框架上,那真是HotFix easy咯!!期盼着这一天的来临啊。

顺便想请大家谈谈各自对OSGi的看法,有怎样的期许?愿望?想怎样用?又有哪些的担心,和潜在的风险问题?
分享到:
评论
39 楼 yipsilon 2009-04-07  
大体看了一下Instrument特性, 个人感觉 instrument 跟OSGi规范中的类加载机制实现目的是一样的,但对于已经new的对象也是无能为力,它可以做的也是当new新对象时,自动把class类转换过去。也就是说对于已经存在的对象,当存在状态时,也是无法进行新旧转换的。

不知道理解的是否正确...
38 楼 leadyu 2009-04-06  
wl95421 写道
引用

在JVM里要支持Class的Unload和Reload是不可行的,因为它的规范里没有版本管理这一说,所有的类所在的JVM都是同一个版本的,呵呵。而OSGi就有版本管理的机制,也就是说同一个SymbolicName的Bundles,只要版本不同,就可以并存,这也是热部署机制的基础。


不是这个原因,而是关于static变量。我在书上看到的是JVM应该可以Unload一个Class,但不敢肯定JVM中是否规定,但Sun的JDK应该是遵守了这个标准。
书中说JVM如果Unload一个Class,当前Class的ParentClassLoader,假设为AClassLoader,需要满足以下条件:
1、由AClassLoader其所有加载的Class,及其实例都不能被外部引用
2、由AClassLoader其所有加载的Class,不能包含static字段

这个条件正常运行基本上是不能满足地。
所以所谓的Class Unload也基本是不可能的。

至于是否热更新,部署的问题,不想讨论了,如果谁有真正实现了的方案,再一起看看了。



JVM要UnLoad一个ClassLoader,首先,必须所有的由这个ClassLoader定义的类产生的实例全部UnLoad,而且这个过程是JVM内部的。另外一个类A调用类B时,如果类B没有被加载,那么VM会采用类A的Loader去Load类B。

再看,yipsilon上面写的代码,这是其中一个问题,但还不是最大的麻烦,比如可以通过你之前说的获取老版本的引用把属性拷贝过来。还不光光只是静态成员有问题,如果属性本身是个自定义类实例,比如是example.Test的一个实例。那么拷贝过来,也还只是老版本的一个实例,它所有的引用都会采用老版本的ClassLoader去加载,那就乱套了,

所以,基本我了解的热加载实现,似乎都不会去做状态的更新这种事,热加载后,老状态都是任由其丢失的。不管,中间件也好,Osgi也好,都是一样的思路,通过各种限定切分模块,保证组件的隔离性,来实现热加载。

不知道,JDK15的Instrucment是否安全的热加载实现?没试过

37 楼 wl95421 2009-04-06  
引用

在JVM里要支持Class的Unload和Reload是不可行的,因为它的规范里没有版本管理这一说,所有的类所在的JVM都是同一个版本的,呵呵。而OSGi就有版本管理的机制,也就是说同一个SymbolicName的Bundles,只要版本不同,就可以并存,这也是热部署机制的基础。


不是这个原因,而是关于static变量。我在书上看到的是JVM应该可以Unload一个Class,但不敢肯定JVM中是否规定,但Sun的JDK应该是遵守了这个标准。
书中说JVM如果Unload一个Class,当前Class的ParentClassLoader,假设为AClassLoader,需要满足以下条件:
1、由AClassLoader其所有加载的Class,及其实例都不能被外部引用
2、由AClassLoader其所有加载的Class,不能包含static字段

这个条件正常运行基本上是不能满足地。
所以所谓的Class Unload也基本是不可能的。

至于是否热更新,部署的问题,不想讨论了,如果谁有真正实现了的方案,再一起看看了。

36 楼 yipsilon 2009-04-06  
leadyu 写道

OSGi,我倒没升入研究过,不过,起码中间件提供的热部署方案是不安全的。好,再看你说的OSGi的做法:可以得到旧的引用,更新下状态,我想到的有几个问题:

首先,就像前面那位老兄说的,你怎么知道插件里有状态需要更新?不管是Buddle A还是Buddle B去做,都不合适,由容器去做,也有问题:

旧有状态里面可能存在一些引用,而这些引用对应的类可能也被更新了,简单的付值过来可是不行的哦,如果OSGi允许获取这种旧有的对象引用,这种引用其实等同于,破坏了OSGi规范好不容易维护起来的隔绝环境


我明白你所担心的问题了,看看下面的伪代码:
class ServiceObj{
  public String state;
}
...
// BundleA_1.0.0 中注册了一个服务
ServiceObj obj = new ServiceObj();
obj.state = "hello";
context.registerService("example.Test", obj, null);
...
// BundleB_1.0.0 中调用该服务
ServiceObj rtn = (ServiceObj)context.getService('example.Test'/*假设这是ServiceReference*/); // state 返回 hello
rtn.state = "changed"; // 这里更改了状态
...
// BundleA_1.0.1 中更新了此服务
ServiceObj obj = new ServiceObj();
obj.state = "world";
context.registerService("example.Test", obj, null); // 安装的时候更新了状态。
...
// 当BundleB_1.0.0 再次调用此服务时
Object rtn = context.getService('example.Test'/*假设这是ServiceReference*/); // 旧的状态 changed 没有了,state 返回的是最新的 world

这段代码说明服务内部状态被改变了,是这个意思吧?
35 楼 leadyu 2009-04-06  
yipsilon 写道
leadyu 写道
如何保证新的应用实例是安全的呢?比如你的代码里存在静态数据,而这些数据是功能依赖的,在热部署后,状态丢失,新的代码还能正确跑起来吗?

当然,可以通过ClassLoader去制造一个相对隔绝的应用环境,但是也是没法完全保证所有的引用是隔绝的,同时也没有办法替换新的状态,存在诸多限制,对应用代码来说,不是完全透明的机制。不能说,中间件有热部署功能了,就可以放心的更新代码了


OSGi热部署实现原理我的文章里有介绍:http://yipsilon.iteye.com/blog/361660

OSGi规范中定义可以使用BundleContext.getAllServiceReferences方法来获取所有的同名服务,如果你的旧插件中存储有状态,使用上述方法可以获取到旧插件对象,然后新旧插件之间进行一下状态更新不就可以了。



OSGi,我倒没升入研究过,不过,起码中间件提供的热部署方案是不安全的。好,再看你说的OSGi的做法:可以得到旧的引用,更新下状态,我想到的有几个问题:

首先,就像前面那位老兄说的,你怎么知道插件里有状态需要更新?不管是Buddle A还是Buddle B去做,都不合适,由容器去做,也有问题:

旧有状态里面可能存在一些引用,而这些引用对应的类可能也被更新了,简单的付值过来可是不行的哦,如果OSGi允许获取这种旧有的对象引用,这种引用其实等同于,破坏了OSGi规范好不容易维护起来的隔绝环境
34 楼 yipsilon 2009-04-06  
wl95421 写道

假设有一个Bundle称为A,可以被另外Bundle称为B的来热更新
问题是谁来负责状态更新啊?
是A吗?不应该是,因为A和B应该没有严格的约束关系?
是B吗?也不应该是,原因同上
OSGi容器吗?问题在于,谁知道哪些状态要更新,更新的方式是什么呢?可以想一下J2EE的Session,它做HotDeploy的方式也可以算是一种热更新,但我觉得目前所谓J2EE服务器所谓的HotDeploy基本是个玩具(过分一点说,可以说是笑话),而且如果更新失败,又怎么处理呢?
再比如说,现在有代码持有了Bundle A中的某个服务对象,那么怎么办呢?


假设你所说的SymbolicName为A的bundle版本为 1.0.0, 如果要更新,建议你新做一个版本为 1.0.1 的A的bundle,然后进行安装。这样,依赖关系就得以保存了。就像之前那位仁兄说的,已经调用旧版本的事务中,会继续使用旧版本的服务,而新的事务就会调用新版本的服务。待到所有的插件都调用新版本的服务后,再卸载旧的那个bundle,这不就达到了热部署的目的了么? 如果1.0.1版本的A安装出现问题,那事务们顶多还是用回1.0.0版本的服务,不用停机修复。

wl95421 写道

大家如果有兴趣的话,可以查一下JDK的历史,它曾经有一个版本,是1.1的某个版本,支持Class的Unload和Reload,结果后来又放弃了,然后给出了一个严格的Class对应的Unload和Reload规范,现在几乎不可能做到Class的Unload和Reload了。有兴趣的朋友可以查一下这段历史,有些意思的。


在JVM里要支持Class的Unload和Reload是不可行的,因为它的规范里没有版本管理这一说,所有的类所在的JVM都是同一个版本的,呵呵。而OSGi就有版本管理的机制,也就是说同一个SymbolicName的Bundles,只要版本不同,就可以并存,这也是热部署机制的基础。
33 楼 xyz20003 2009-04-05  
我觉得不是动态的问题。

是模块化切分和版本管理问题。

试想,本来做产品需要一个trunk,多个branches。要是换了OSGi,产品都可以按模块算了,多少个模块,每个模块用哪个版本。

这样是不是就好多了,而且可以把interface都抽离到单独的api里,制成一个bundle,其他bundle提供实现,系统集成测试时再把各个模块拼接起来。这样是不是更好一些。
32 楼 daquan198163 2009-04-05  
要动态还是用动态语言吧
31 楼 xyz20003 2009-04-05  
我觉得system boot环境持有的应该是bundle中的引用,而不是实际的对象。(这点只是猜想尚未去代码实现里做过验证)

从规范文档里看,OSGi的bundle也是可以指定依赖顺序的,即当环境中已经存在了某些依赖才可以安装成功,并启动服务。从spring dm那本书里可以看到支持类似的依赖检测。(这点也没实际用过,但是感觉import-package这类的含义应该就是指定bundle的前提条件)

再者,通过接口编程,system boot里获得的只是一个接口,这里很像rmi之类的远程调用,个人感觉就算bundle被uninstall了,system boot又去访问,最多就是一个ClassNotFoundException,在system boot里catch住就行了。

我们更愿意把OSGi看做是原系统的插件平台,估计跟OSGi Server的概念相差甚远,但是OSGi的热部署之类的形式应该是相似的。不过接触时日尚短,希望多多批评指正。

30 楼 wl95421 2009-04-05  
引用
OSGi规范中定义可以使用BundleContext.getAllServiceReferences方法来获取所有的同名服务,如果你的旧插件中存储有状态,使用上述方法可以获取到旧插件对象,然后新旧插件之间进行一下状态更新不就可以了。


假设有一个Bundle称为A,可以被另外Bundle称为B的来热更新
问题是谁来负责状态更新啊?
是A吗?不应该是,因为A和B应该没有严格的约束关系?
是B吗?也不应该是,原因同上
OSGi容器吗?问题在于,谁知道哪些状态要更新,更新的方式是什么呢?可以想一下J2EE的Session,它做HotDeploy的方式也可以算是一种热更新,但我觉得目前所谓J2EE服务器所谓的HotDeploy基本是个玩具(过分一点说,可以说是笑话),而且如果更新失败,又怎么处理呢?
再比如说,现在有代码持有了Bundle A中的某个服务对象,那么怎么办呢?

大家如果有兴趣的话,可以查一下JDK的历史,它曾经有一个版本,是1.1的某个版本,支持Class的Unload和Reload,结果后来又放弃了,然后给出了一个严格的Class对应的Unload和Reload规范,现在几乎不可能做到Class的Unload和Reload了。有兴趣的朋友可以查一下这段历史,有些意思的。
29 楼 yipsilon 2009-04-05  
leadyu 写道
如何保证新的应用实例是安全的呢?比如你的代码里存在静态数据,而这些数据是功能依赖的,在热部署后,状态丢失,新的代码还能正确跑起来吗?

当然,可以通过ClassLoader去制造一个相对隔绝的应用环境,但是也是没法完全保证所有的引用是隔绝的,同时也没有办法替换新的状态,存在诸多限制,对应用代码来说,不是完全透明的机制。不能说,中间件有热部署功能了,就可以放心的更新代码了


OSGi热部署实现原理我的文章里有介绍:http://yipsilon.iteye.com/blog/361660

OSGi规范中定义可以使用BundleContext.getAllServiceReferences方法来获取所有的同名服务,如果你的旧插件中存储有状态,使用上述方法可以获取到旧插件对象,然后新旧插件之间进行一下状态更新不就可以了。
28 楼 leadyu 2009-03-20  
引用
系统的新版本发布,但不影响用户使用。在线用户仍然处理在旧系统的实例上,直到一笔业务完成;新发起的请求则指向新的系统。


如何保证新的应用实例是安全的呢?比如你的代码里存在静态数据,而这些数据是功能依赖的,在热部署后,状态丢失,新的代码还能正确跑起来吗?

当然,可以通过ClassLoader去制造一个相对隔绝的应用环境,但是也是没法完全保证所有的引用是隔绝的,同时也没有办法替换新的状态,存在诸多限制,对应用代码来说,不是完全透明的机制。不能说,中间件有热部署功能了,就可以放心的更新代码了



27 楼 linliangyi2007 2009-03-20  
leadyu 写道
linliangyi2007 写道
leadyu 写道
wl95421 写道
OSGi的热插拔远非想像中的那么好
我本身是做Eclipse插件的
只能说OSGi更多的好处是在模块化和运行时的一些管控上
热插拔的特性我认为远非OSGi的首要优点

无意争论,只是个人观点


恩,我也这么想,OSGI在‘开放’‘平台’上才有意义,热插拔,只是手段而已,而且,似乎java没有什么真正严格意义的安全的热插拔技术,如果有,望告知,呵呵。


1,可以尝试自己做“热更新的”系统缓存,至少俺试过,可行。不知道你值得“安全热插拔”有啥特殊的?java在这点上跟其他语言有啥差异?
2,如:WebSphere等商用app server就确实支持应用的热部署啊,难道不能算“热插拔”?

“热更新的”系统缓存?能讲具体点吗?

中间件之所以,能做到热加载,取决于它维护的一套庞大而复杂的ClassLoader,隔离性好些,才能热加载。如果交叉的引用,一样加载不了。

而且,就算热加载后,状态也是要丢失的诶,这怎么安全呢?


我的理解跟你有所不同,热加载是指用户在使用过程中,系统的新版本发布,但不影响用户使用。在线用户仍然处理在旧系统的实例上,直到一笔业务完成;新发起的请求则指向新的系统。

26 楼 leadyu 2009-03-20  
linliangyi2007 写道
leadyu 写道
wl95421 写道
OSGi的热插拔远非想像中的那么好
我本身是做Eclipse插件的
只能说OSGi更多的好处是在模块化和运行时的一些管控上
热插拔的特性我认为远非OSGi的首要优点

无意争论,只是个人观点


恩,我也这么想,OSGI在‘开放’‘平台’上才有意义,热插拔,只是手段而已,而且,似乎java没有什么真正严格意义的安全的热插拔技术,如果有,望告知,呵呵。


1,可以尝试自己做“热更新的”系统缓存,至少俺试过,可行。不知道你值得“安全热插拔”有啥特殊的?java在这点上跟其他语言有啥差异?
2,如:WebSphere等商用app server就确实支持应用的热部署啊,难道不能算“热插拔”?

“热更新的”系统缓存?能讲具体点吗?

中间件之所以,能做到热加载,取决于它维护的一套庞大而复杂的ClassLoader,隔离性好些,才能热加载。如果交叉的引用,一样加载不了。

而且,就算热加载后,状态也是要丢失的诶,这怎么安全呢?
25 楼 linliangyi2007 2009-03-17  
leadyu 写道
wl95421 写道
OSGi的热插拔远非想像中的那么好
我本身是做Eclipse插件的
只能说OSGi更多的好处是在模块化和运行时的一些管控上
热插拔的特性我认为远非OSGi的首要优点

无意争论,只是个人观点


恩,我也这么想,OSGI在‘开放’‘平台’上才有意义,热插拔,只是手段而已,而且,似乎java没有什么真正严格意义的安全的热插拔技术,如果有,望告知,呵呵。


1,可以尝试自己做“热更新的”系统缓存,至少俺试过,可行。不知道你值得“安全热插拔”有啥特殊的?java在这点上跟其他语言有啥差异?
2,如:WebSphere等商用app server就确实支持应用的热部署啊,难道不能算“热插拔”?
24 楼 leadyu 2009-03-17  
wl95421 写道
OSGi的热插拔远非想像中的那么好
我本身是做Eclipse插件的
只能说OSGi更多的好处是在模块化和运行时的一些管控上
热插拔的特性我认为远非OSGi的首要优点

无意争论,只是个人观点


恩,我也这么想,OSGI在‘开放’‘平台’上才有意义,热插拔,只是手段而已,而且,似乎java没有什么真正严格意义的安全的热插拔技术,如果有,望告知,呵呵。
23 楼 wl95421 2009-03-17  
整理邮件,发现前段时间回复同事的一段话,是关于网上一篇文章说“OSGi将成为下一个EJB么?”引发的,原文在CSDN上,下面是我的邮件中的回复。

1、EJB和OSGi的设计目标本身就不一样,前者一直是在为整个企业做中间层,而后者现在的目的则是以一个标准去模块化地架构一个系统,所以与其说OSGi是一个标准,不如说它更是一种软件思路的体现。
2、EJB最重要的内容是什么?是EJB Container,这也是EJB重的一个根本原因。而OSGi最重要不是OSGi Container,而是Bundle,事实上Bundle几乎与普通的Jar包没有区别,所以它没有轻重之说。
3、至于作者说Bundle附加的限制,这个我觉得在任何一个体系结构中都是不可能避免的。象多ClassLoader结构,即有好处,也有坏处,就要看具体的环境了,就象某些环境下,用EJB仍然是最佳的选择一样,如果应用程序体系结构本身就不需要集群,不需要复杂事务等等一系列内容,EJB就用不上。同样如果程序不能很好的划分模块,特别是涉及到遗留系统,那么OSGi可能也不合适。
4、EJB之所以被骂,更多是因为不负责任的宣传,不过现在OSGi也出现一些不负责任的宣传,也就是说不加思考就直接使用某个系统或者框架,那么不管是EJB,还是OSGi,或者Spring,都会被骂!
22 楼 wl95421 2009-03-15  
问题就在于依赖关系部分
拿Eclipse说明,因为支持扩展点(其实象JDK6引入的Service也是一样)
就表示你对象的实例有可能被其它的Bundle持有
也就是说只有一个Bundle中的对象或者类被其它Bundle或者系统拥有
几乎肯定这个Bundle就不可能dispose。
所以OSGi的热加载是可能的,但目前看来热替换不现实
可以说热插不能热拔
21 楼 hatedance 2009-03-15  
eclipse是不是基于osgi了啊,每次update一个插件,都强烈要求我重启eclipse来着。不过我倒是无所谓。
我觉得能不能热拔插还是要看业务逻辑。如果2个插件之间没什么依赖关系的时候,你的确是可以热拔插任何一个的的。否则,情况就很难说了。
另外,我觉得windows的系统服务就是跟这个osgi的东西很类似。
20 楼 galaxystar 2009-03-14  
业务系统也用osgi, 有点浪费. 个人感觉学习成本过高,且osgi的模块化开发模式会降低生产力, 调试也会更麻烦.
osgi还是拿来做基础产品比较好.比如, 一些中间件之类的.

相关推荐

    深入理解OSGi:Equinox原理、应用与最佳实践.pdf

    OSGi(Open Service Gateway Initiative)是一个定义了Java应用程序如何组织和模块化以及如何动态发现、启动、停止、更新这些模块化组件的规范。Equinox是OSGi规范的一个实现,它是由Eclipse基金会开发的。本文将...

    深入理解OSGi:Equinox原理、应用与最佳实践源代码+equinox-SDK-3.8源代码

    本资源包括两部分:《深入理解OSGi:Equinox原理、应用与最佳实践》的源代码和equinox-SDK-3.8的源代码。 深入理解OSGi这本书提供了对OSGi,特别是Equinox实现的全面洞察。书中可能涵盖以下几个知识点: 1. **OSGi...

    osgi资料

    虽然不是直接关于OSGi,但Spring框架与OSGi的集成是常见的应用场景,这本书可能涉及: - Spring与OSGi的整合:介绍如何在OSGi环境中使用Spring,如使用Declarative Services或Blueprint API。 - 微服务架构:讨论...

    深入理解OSGi:Equinox原理、应用与最佳实践,书本源代码

    在深入理解OSGi:Equinox原理、应用与最佳实践中,我们可以学习到以下几个关键知识点: 1. **模块化编程**:OSGi的核心是模块化,它将应用程序划分为独立的单元,称为服务或bundle。每个bundle都有自己的类路径,...

    OSGi原理与最佳实践(完整版)&OSGi_in_action

    本资源包含两本书籍:“OSGi原理与最佳实践(完整版)”和“OSGi in Action”,这两本书都是关于OSGi技术的深入探讨。 《OSGi原理与最佳实践》可能涵盖了以下内容: 1. **OSGi基础**:介绍OSGi的核心概念,如模块...

    关于OSGI分布式开发简单连接数据库

    以下是一些关于如何在OSGI环境中配置和使用数据库连接的知识点: 1. **服务注册与发现**:在OSGI框架中,数据库连接通常通过服务注册来实现。你可以创建一个提供数据库连接的模块(bundle),并在该模块中注册一个...

    深入理解OSGi:Equinox原理、应用与最佳实践.zip

    在《深入理解OSGi:Equinox原理、应用与最佳实践》这本书中,作者深入探讨了OSGi的核心概念、Equinox的工作原理以及如何在实际项目中应用OSGi。这本书的源码可能是为了辅助读者理解和实践书中所讲解的内容。 **OSGi...

    未来10年:OSGi、Spring-DM.docx

    OSGi框架可以应用于C/S应用中,提供了模块化、动态性和灵活性。OSGi框架可以帮助开发者快速构建和部署基于C/S的应用程序。 OSGi框架提供了模块化、动态性和灵活性,解决了Java EE开发及部署模型的局限性。OSGi 4.2...

    spring-osgi 入门手册和代码

    - **灵活性**:Spring OSGi 可以与现有的 Spring 应用集成,同时利用 OSGi 的优势,提高应用程序的灵活性和可扩展性。 3. **开始使用 Spring OSGi** - **环境准备**:安装一个 OSGi 容器,如 Apache Felix 或 ...

    Java应用架构设计 模块化模式与OSGi.zip

    Java应用架构设计中,模块化模式与OSGi是两个关键概念,它们对于构建大型、可扩展且易于维护的系统至关重要。模块化模式使得代码组织更加有序,而OSGi(Open Services Gateway Initiative)则是一种实现模块化的动态...

    osgi,林昊写的osgi实战和进阶

    OSGI(Open Services Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序分解为一系列可独立部署、更新和交互的服务。林昊所著的《OSGI实战》与《OSGI进阶》是深入理解OSGI技术的重要参考资料,适合...

    OSGi Web示例工程

    在OSGi框架中,Equinox是Eclipse基金会提供的一个实现,它是OSGi规范的主要实现之一,广泛应用于服务器端开发。Equinox提供了一个强大的、可扩展的运行时环境,支持动态模块加载和卸载,使得开发者可以灵活地更新和...

    Osgi in action.pdf

    7. **管理模块和应用程序**:提供关于如何在OSGi环境中管理和配置模块及应用程序的指导。 8. **测试应用程序**:介绍如何在OSGi环境下进行单元测试、集成测试等。 9. **调试应用程序**:讲解在OSGi环境中调试应用...

    未来10年:OSGi、Spring_DM

    此外,书中还讨论了如何利用OSGi来构建浏览器/服务器(B/S)应用,涉及了不同的实现方案,如HTTP服务、内置Jetty服务器、基于Apache Tomcat等。 #### 深入浅出各种标准OSGi服务 这一部分深入探讨了OSGi中提供的各种...

    OSGI中Hibernate扩展在felix中的应用

    OSGI(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许开发人员将应用程序分解为可独立更新和管理的组件。Hibernate则是一个流行的Java对象关系映射(ORM)框架,它简化了数据库操作。当...

    OSGI资料,OSGI进阶,OSGI实战,OSGI入门和整合Spring

    2. **案例分析**:通过具体的应用场景,如构建可插拔的Web服务器、数据库连接池等,展示OSGI的优势。 3. **部署与打包**:学习如何将OSGI应用打包成bundle并部署到OSGI运行时环境,如Apache Felix或Karaf。 4. **...

    OSGi 入门+进阶+实战

    4. **企业应用案例**:OSGi常用于企业应用服务器(如Apache Karaf)和嵌入式系统,如路由器、智能家居设备等。 5. **故障排查**:学习如何使用日志、诊断工具和调试技巧来定位和解决OSGi应用中的问题。 6. **性能...

    很久之前的osgi整理

    5. 面向切面编程(AOP)与OSGi:可能涉及到OSGi如何与AOP结合,提供更灵活的代码组织和部署方式。 6. OSGi与企业应用:分析OSGi在企业级应用中的优势,如简化依赖管理、提高可维护性和可扩展性。 7. 开发工具与...

    基于OSGi和Spring开发Web应用.doc

    1. OSGi:OSGi 是一种面向服务的框架,能够提供动态模块部署和管理的能力。 2. Spring:Spring 是一个轻量级的 J2EE 开发框架,特点是面向接口编程和非侵入式的依赖注入。 3. Spring-DM:Spring-DM 是 Spring 开发...

Global site tag (gtag.js) - Google Analytics