Tomcat类加载的架构及存放目录

这篇文章主要介绍“Tomcat类加载的架构及存放目录”,在日常操作中,相信很多人在Tomcat类加载的架构及存放目录问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Tomcat类加载的架构及存放目录”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

创新互联建站服务项目包括扎囊网站建设、扎囊网站制作、扎囊网页制作以及扎囊网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,扎囊网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到扎囊省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!


1、Web服务器需要解决的问题

一个功能健全的Web服务器,都需要解决如下几个问题:

(1)同一个服务器上的两个Web程序所使用的Java类库实现相互独立隔离:不能一个类库在同一个服务器上只有一份却被多个程序使用。

(2)同一个服务器上的两个Web应用程序所使用的Java类库可以被共享:如果不能共享的话,虚拟机内部的Method Area 可能会出现过度膨胀现象。

(3)服务器的类库要与Web应用程序的类库相互隔离,互不影响(即服务器不收Web程序的影响):很多服务器可能是用Java来实现,自然就得使用一些只属于自己的类库。

(4)支持JSP的热替换(HotSwap):大部分主流服务器(WebLogic除外)修改JSP文件都不需要重启服务器。

试想一下,如果上述的4点中任何一点不能满足,特别是(1)-(3)点,那么整个Java Web服务器都是“混乱”的,或者说是不健全的。

2、Tomcat类库存放目录

既然要满足以上四点基本要求,那么当部署一个Web应用时,一个Classpath路径目录是无法满足需求的,通常会提供多个Classpath(一般以classes/lib命名)路径目录,而目录中都会有一个相应的自定义类加载器去加载里面的Java类。在Tomcat中就有三组目录,分别是:/common/*、/server/*、/shared/*;

但值得强调的是在Tomcat 6.x之后这三组目录就不存在了,只有一个总的/lib目录,其他都需要进入配置文件需要时单独配置。所以这里介绍的目录未必能在tomcat安装目录下找到,不过其用意都是一样的;

(1)/common/*:实际创建的时候为/common/lib/目录,可以被Tomcat与所有的Web应用共享的类库都在里面;

但是在Tomcat 6之后/common/lib/目录被废弃,现在默认的是在/lib/下,实际上是将/common、/server、/shared三个目录默认合并到一个/lib目录下。如果不满足具体的业务需求的话,可以在conf/catalina.properties中设置server.loader与shared.loader。打开conf/catalina.properties可以看到:无论是${catalina.base},还是"${catalina.home},都会去找/lib/目录,指定加载的加载器。

Tomcat类加载的架构及存放目录

CATALINA_BASE:是实例配置位置,也就是一个tomcat可以配置多个实例,实例里面有自己的配置;

CATALINA_HOME:是tomcat安装位置;

common.loader、server.loader、shared.loade:表示tomcat指定自定义的三个加载器。

        Tomcat类加载的架构及存放目录

Tomcat类加载的架构及存放目录      

Tomcat类加载的架构及存放目录

  (2)/server/*:实际创建的时候为/server/lib目录,只能被Tomcat使用的类库。

  (3)/shared/*:实际创建的时候为/shared/lib目录,可以被所有的Web应用程序共享使用,但是对Tomcat是不可见的。

  (4)/webapps(wtswebapps)/project/WEB-INF/*:实际为/WebApp/project/WEB-INF/lib,是Project独享有的类库。

3、Tomcat自定义加载器

Tomcat自定义的类加载器主要有:ComnonClassLoader、CatalinaClassLoader、SharedClassLoader和WebAppClassLoader四个类加载器。

(1)ComnonClassLoader:加载/common/*目录下的类,但是上述可知现在的指定加载都会在Catalina.properties中配置。

(2)CatalinaClassLoader:加载/server/*目录下的类,同理现在在Catalina.properties中指定配置。

(3)SharedClassLoader:加载/shared/*目录下的类,同理现在在Catalina.properties中指定配置。

(4)WebAppClassLoader:加载/webapps(wtswebapps)/project/WEB-INF/*目录下项目lib中的类。

   结合之前三个类加载器(BootstrapClassLoader、ExtensionClassLoader、ApplicationLoader)与Tomcat自定义的四个加载器组合成的委派关系(Tomcat服务器的类加载机构)如下所示:

               Tomcat类加载的架构及存放目录

    (注:其中JasperLoader为Jsp类加载器,JSP文件编译后为Class文件,需要加载)

通过此关系图我们可以得到如下两点:

(1)CatalinaClassLoader与SharedClassLoader是相互隔离独立的;

(2)WebAppClassLoader可以使用SharedClassLoader加载类,同理WebAppClassLoader可以代替JspClassLoader加载类,CommonClassLoader加载的类可以被CatalinaClassLoader与SharedClassLoader使用。

同时需要注意还有以下两点:

  • JspClassLoader只能加载这个JSP文件所编译出Class文件,当JSP文件被修改时,会替换当前JspClassLoader实例,之后会重新建立一个新的JspClassLoader实例,这也就是HotSwap的内部实现;

  • 不同的WebAppClassLoader是相互隔离的

  • 对于Tomcat 6.x版本,只有在conf/catalina.properties中配置了shared.loader与server.loader才能使用SharedClassLoader与CatalinaClassLoader实例,不然会默认使用ComnonClassLoader的实例来代替;

  • 如果默认设置不能满足需要,则可以通过修指定配置文件中的shared.loader与server.loader,之后重新启动Tomcat 5.x加载器架构。

到此,关于“Tomcat类加载的架构及存放目录”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


文章题目:Tomcat类加载的架构及存放目录
本文来源:http://cdiso.cn/article/jiegje.html

其他资讯