明辉站/技术开发/内容

Tomcat4.1.x以上中类的加载

技术开发2023-08-15 阅读
[摘要]Tomcat4.1.x以上中类的加载快速开始1.某一个特殊的web应用用到的类或者资源,应该把它解压缩放在这个web应用的web-inf/classes下,或者把jar文件放在这个web应用的web-inf/lib下2.很多web应用公用的类或者资源,应该把它解压缩放在%CATALINA_HOME...
Tomcat4.1.x以上中类的加载
快速开始
1.某一个特殊的web应用用到的类或者资源,应该把它解压缩放在这个web应用的web-inf/classes下,或者把jar文件放在这个web应用的web-inf/lib下
2.很多web应用公用的类或者资源,应该把它解压缩放在%CATALINA_HOME%/shared/classes下(如果是4.0.x则是%CATALINA_HOME%/classes),或者把jar文件放在%CATALINA_HOME%/shared/lib下(如果是4.0.x则是%CATALINA_HOME%/lib)
预览
象很多应用程序服务器一样,tomcat4.x安装了一种特殊的class loader(这个类继承了抽象类java.lang.ClassLoader),所以它允许容器的不同部分和应用程序访问相应的不同的资源。
在java2(jdk1.2以上)环境中,class loader被抽象成一个树型。当一个class loader被请求装载一个特殊的类或资源时,它把这个请求委派给自己的上一层,当上一层没有找到这个类或资源时,它才在自己的范围内查找并加载。Web 应用程序类的装载有细微的不同,但是主要的原理都是一样的。
当tomcat4启动时,它建立如下所示的树型关系。
Bootstrap

System

Common
/ \
Catalina Shared
/ \
Webapp1 Webapp2 ...
详细解释
当tomcat初始化时,它建立了如上图所示的class loader结构。
Bootstrap
这个class loader 包含了基本的运行时的类,和一些扩展类(在%JAVA_HOME%/jre/lib/ext 目录下),这些类都由jvm自动加载。
System
这个class loader 通常用来初始化classpath环境变量的内容,所有的这些类对tomcat内在的类和所有的web应用程序是可见的。但是标准的tomcat4.x启动脚本(%CATALINA_HOME%/bin/catalina.sh 或者 %CATALINA_HOME%/bin/catalina.bat)忽略classpath,而丛下面的地方装载
1.%CATALINA_HOME%/bin/bootstrap.jar-包含了main()方法初始化tomcat4.x Server,而且class loader依靠它实现。
2.%JAVA_HOME%/lib/tools.jar-包含了javac 编译程序,它可以把jsp页面转换为servlet。
Common
这个class loader加载的类对tomcat内在的类和所有的web应用程序是可见的,通常web应用程序的类不应该放在这里。
解压后的类或资源放在%CATALINA_HOME%/common/classes 目录下,没有解压的类或资源的jar文件放在
%CATALINA_HOME%/commons/endorsed 和%CATALINA_HOME%/common/lib directories 目录下。这里默认的包含了如下资源和类:
1.jndi.jar - The Java Naming and Directory Interface API classes (这个包仅仅在jdk1.2才会被加载,jdk1.3或更高版本由jvm自动加载)。
2.naming-common.jar – tomcat实现的jndi 描述内存中的命名上下文。
3.naming-resources.jar – tomcat实现的特殊的jndi用来表现web应用程序的静态资源。
4.Servlet.jar – Servlet 和 jsp 用到的类。
5.Xserces.jar - xml解析器默认情况下对tomcat内在的类和所有的web应用程序是可见的,如果要对一个特殊的web应用程序用特殊的xml解析器,可以把这个解析器放在/web-inf/lib中。
Catalina
这个class loader 为tomcat自己初始化所有的类和资源,这些类和资源对web应用程序来说都是不可见的,所有的解压缩的类和资源都在%CATALINA_HOME%/server/classes目录下,所有的压缩的类和资源的jar文件都在%CATALINA_HOME%/server/lib目录下。
Shared
这个类装载器载入的类和资源能对所有的web应用程序可见(如果tomcat的内置类也要用到这些,则应该把这些放入到common装载器中)。
没有压缩的类和资源放在%CATALINA_HOME%/shared/classes目录中,压缩的类和资源的jar文件放在%CATALINA_HOME%/lib(为了和前面的版本兼容)或者%CATALINA_HOME%/shared/lib目录中。通常包含了以下几个默认包:
1.jasper-compiler.jar - 编译把jsp转换成servlet并编译他们所用到的类。
2.jasper-runtime.jar - 运行由jsp编译成servlet后的class要用到的环境。
3.naming-factory.jar - 为web应用程序提供默认的jndi服务所要用到的类。
WebappX
Tomcat实例为每一个web应用程序实现一个webapp class loader,所有的解压缩类和资源都放在这个web应用程序的/web-inf/classes目录下,所有的类和资源的压缩文件jar都放在这个web应用程序的/web-inf/lib目录下,这些类和资源只对这个web应用程序是可见的,对其它的web应用程序都是不可见的。
和前面不同的是,当一个web应用程序请求加载一个类时,它首先在这个web class loader范围内加载,而不是和通用的规则一样先从父class loader开始加载。
因此web应用程序类的加载是按一下的顺序的
1.这个应用程序的/WEB-INF/classes
2.这个应用程序的/WEB-INF/lib/*.jar
3.JVM 的Bootstrap classes r
4.System class loader classses (见上面的描述)
5.%CATALINA_HOME%/common/classes
6.%CATALINA_HOME%/common/endorsed/*.jar
7.%CATALINA_HOME%/common/lib/*.jar
8.%CATALINA_HOME%/shared/classes
9.%CATALINA_HOME%/shared/lib/*.jar

……

相关阅读