This page validates as XHTML 1.0, and will look much better in a browser that supports web standards, but it is accessible to any browser or Internet device. It was created using techniques detailed at glish.com/css/.
Class Loader在JES Application Server的问题
经常有JES Application Server的客户抱怨,如果在应用中使用了开源的工具包(例如:org.apache.commons.collections),在JES上就会有错误,经常出现ClassNotFound的异常。其实解决这个问题只是一个配置的问题。下面介绍这个问题产生的原因以及解决方案。

每一种应用服务器都有自己的Class Loader,而且各个Class Loader的实现方式和层次结构都不太相同。因此在使用和部署应用的时候,需要先了解当前应用服务器的Class Loader的特点,才能知道哪些类库文件应该放到哪个目录下。
Class Loader的原理比较复杂,我会在以后详细介绍,大家也可以在网上收看我有关这个技术的视频录像(http://vbook.china-pub.com/vbook/vinfo.asp?id=55)。总的来说,应用服务器使用class loader的主要目的是为了安全和效率。安全是通过Class Loader将不同的应用互相隔离,使得不同的应用可以有相同的类名,而不互相干扰。效率是通过代理(delegate)模式来使得各个不同的应用如果使用相同的类库,只在内存中装载一次,节省装载的时间和对内存的开销。
正是因为代理的模式,导致了上面的问题:在 JES Application Server本身实现中已经使用了大量开源的软件包,例如(org.apache.commons)的各个工具包。在代理模式下,各个Web应用会把类装载的工作代理给它的上级或上级的上级等等。如果当JES Application Server本身已经装载这些包,那就不会再装载应用中的相同名字的类库了。当应用使用的类库与JES使用的类库有版本冲突的时候,就会造成一些麻烦。
在Web应用的部署过程中,只需要在sun-web.xml描述文件中,加上下面的属性值,就能关闭代理的模式,解决上面的问题。
<class-loader>
<property delegate=false/>
</class-loader>
在Glassfish中还有更好的解决方案,在以后的文章中再介绍。
Posted at 06:27下午 四月 29, 2007 by 王昱 in Java | 评论[0]