« 十一月 2008
星期日星期一星期二星期三星期四星期五星期六
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
      
今天

Blog::Navigation

Blog::Editing

Bookmarks::Blogroll

Blog::Referers

Site notes

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/.

Powered by Roller Weblogger.
« 在Glassfish中进行EJB调用的几... | Main | HTTP的URL最长可以有多长 »
星期日 四月 29, 2007

Class Loader在JES Application Server的问题

经常有JES Application Server的客户抱怨,如果在应用中使用了开源的工具包(例如:org.apache.commons.collections),在JES上就会有错误,经常出现ClassNotFound的异常。其实解决这个问题只是一个配置的问题。下面介绍这个问题产生的原因以及解决方案。

一.ClassLoader 在应用服务器中的使用

每一种应用服务器都有自己的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使用的类库有版本冲突的时候,就会造成一些麻烦。

二. JES上的解决方案

在Web应用的部署过程中,只需要在sun-web.xml描述文件中,加上下面的属性值,就能关闭代理的模式,解决上面的问题。

<class-loader>
    <property delegate=false/>
</class-loader>

在Glassfish中还有更好的解决方案,在以后的文章中再介绍。

评论:

发表一条评论:
该日志评论功能被禁用了。
Copyright (C) 2003, 王昱