java类随着tomcat启动加载_Java和Tomcat类加载机制
加载类是运⾏程序的基础,了解Java和Tomcat的类加载机制对更有效地开发、调试Web应⽤程序有⼀定的积极作⽤。本⽂简单介绍Java和Tomcat的类加载机制,希望对⼤家有所帮助。
·JDK/JRE⽂件结构
在安装JDK后,其典型的⽬录层次如下所⽰(JDK 1.6.0):
主要的⽬录和JAR简述如下:
·\bin: 包含在JDK中的开发⼯具的可执⾏⽂件,⼀般⽽⾔,PATH环境变量应包含该⽬录。
·
\lib: 开发⼯具使⽤的⽂件,其中包括(1)tools.jar:该JAR包包含⽀持JDK中⼯具类和实⽤类的⾮核⼼类。同时也包含(2)dt.jar:BeanInfo使⽤的设计时(DesignTime)归档⽂件,该JAR包告诉IDE如何显⽰Java组件和如何让开发者定制它们。其中主要包含Swing的相关类。
·\jre\lib:包含Java运⾏时环境使⽤的核⼼类、属性设置和资源⽂件等。例如:(1)rt.jar:引导类(组成Java平台核⼼API的运⾏时类);(2)charsets.jar:字符转换类。
在⼀个典型的Web应⽤环境中,在设置CLASSPATH环境变量是,通常需要包含以下条⽬:
·设置好path变量,使得我们能够在系统中的任何地⽅运⾏java应⽤程序,⽐如javac、java、javah等等,变量值: C:\jdk1.6.0\bin;
·classpath环境变量,是当我们在开发java程序时需要引⽤别⼈写好的类时,要让java解释器知道到哪⾥去这个类。
C:\jdk1.6.0\lib\tools.jar;C:\jdk1.6.0\lib\dt.jar。
·设置JAVA_HOME: 了⽅便引⽤。C:\jdk1.6.0
注:在使⽤Tomcat作为Servlet/JSP容器的Web环境中,Tomcat在启动过程中清除了原有CLASSPATH的内容,并对其进⾏了重新定义。细节见下⽂。
·Java类加载机制
Java启动器(java)初始化Java虚拟机。虚拟机按照如下顺序搜索加载类:
1.引导类:组成Java平台的类,包括rt.jar和⼀些别的重要的jar⽂件;
2.扩展类:使⽤Java扩展机制的类,这些类捆绑成JAR⽂件,并被放置在扩展⽬录中;每⼀个在jre/lib/ext扩展⽬录下的JAR⽂件均被设定为⼀个扩展并使⽤Java扩展架构加载;
3.⽤户类:由开发者定义的类和没有利⽤扩展机制的第三⽅类,这些类的位置由⽤户指定,⼀般通过使⽤-classpath命令⾏选项或者使⽤CLASSPATH环境变量来指定其位置。
与之相对应,⾃从J2SE 1.2规范起,JVM就已经利⽤了三种不同的类加载器:
·引导类(Bootstrap)加载器(也称为初始类加载器);
·扩展类加载器;
·系统类加载器。
这些类加载器是有层次的,系统类加载器位于底层,⽽引导类加载器位于上层,它们之间的关系为⽗-
⼦关系。
·引导类加载器:引导类加载器⽤于JVM加载那些它运⾏所需的Java类。实际上,引导类加载器负责加载所有核⼼的Java类(如java.lang.*和java.io.*)。⼀般各种JVM⼚商(包括Sun)使⽤本地代码实现引导类加载器。
·扩展类加载器:Java 1.2引⼊了标准扩展机制。可以将JAR⽂件放置在标准扩展⽬录,JVM将能⾃动地到它们。扩展类加载器负责加载⼀个或者多个扩展⽬录中的所有类。⼀般情况下,只要安装了Java运⾏环境(JRE),那么扩展⽬录为/lib/ext。扩展类加载器可以不是独⽴的类加载器,⼀些实现也许甚⾄允许引导类加载器从扩展⽬录加载类。
·系统类加载器:系统类加载器在CLASSPATH环境变量指定的JAR⽂件中查⾃⼰的类,或通过-classpath命令⾏选项传递该类,如果没有指定,则默认使⽤当前⽬录。系统加载器也⽤于加载应⽤程序的entry point类(即含有main()⽅法的类),对于那些其他任何没有涵盖在以上两类加载器中的类,都默认使⽤系统类加载器。
·委派模型:JVM通过利⽤委派模型知道将使⽤哪个类加载器。Java JDK 1.2以后的版本,⽆论类加载器何时收到加载类的请求。在⼀个类加载器试图加载⼀个请求的类之前,它委派该加载请求到其⽗类类加载器,直到引导类加载器。如果⽗类加载器成功加载所请求的类,那么就返回作为结果的类对象,
只有当⽗类加载器未能加载该类的情况下,原始的类加载器才尝试装载该类。
注:类加载器的更多⾏为:
·懒散加载:上述类加载器并没有预加载在搜索该路径中的所有类。相反它按要求加载类。这样的⾏为称为懒散加载。
·类缓存:标准的Java SE类加载器可以按要求查类,但⼀旦某个类被加载到类加载器中,它将维持加载(缓存)⼀段时间。不过,JVM垃圾收集器可以回收这些Class对象。
·独⽴的命名空间:为每个类加载器分配了唯⼀的命名空间。
servlet和tomcat的关系·Apache Tomcat 5.5 Servlet/JSP类加载机制:
同其它服务器应⽤程序类似,Tomcat 5安装了多种类加载器(即,实现了java.lang.ClassLoader接⼝的类),来允许容器的不同部分和运⾏在容器中的Web应⽤程序来访问不同可⽤类和资源的库。
当Tomcat 5启动时,它创建了⼀套类加载器,这些加载器组织成如下的⽗⼦关系,其中⽗类加载器位于⼦类加载器之上(Tomcat 6.0版本的类加载器层次结构发⽣了变化):
加载器定义如下:
·Bootstrap:该加载器包含由JVM提供的基本的运⾏时类,加上放置在系统扩展⽬录()的JAR⽂件中的类。注:⼀些JVM将该加载器实现为⼀个以上的类加载器,或者它完全不可见;
·System:系统加载器,该加载器通常使⽤CLASSPATH环境变量来初始化。但是标准的Tomcat 5启动脚本(/bin/catalina.sh或者
\bin\catalina.bat>)完全忽略了CLASSPATH环境变量的内容,并使⽤下述库来构建System类加载器。如下:
从上图可以看出,Tomcat使⽤的CLASSPATH并⾮我们先前配置的⽬录。
\bin\bootstrap.jar:包含初始化Tomcat 5服务器的main()⽅法和它所依赖的类加载器实现;
\lib\tools.jar:包含" javac "编译器⽤来将JSP页⾯转化为servlet类;
\jar:包含commons logging API;
\bin\commons-daemon.jar:包含commons daemon API;
jmx.jar :包含JMX 1.2实现。
·Common:该类加载器包含⼀些对Tomcat内部类和web应⽤可见的额外类。其中包括(1)jasper-compiler.jar:JSP 2.0编译器(2)jsp-api.jar:JSP 2.0 API(3)servlet-api.jar:servlet 2.4 API等等。
·Catalina:该加载器初始化⽤来包含实现Tomcat 5本⾝所需要所有类和资源;
·Shared:在所有的web应⽤程序间共享的类和资源;
·WebappX:为每个部署在单个Tomcat 5实例上的Web应⽤创建的类加载器。加载/WEB-INF/classes和WEB-INF/lib下的类和资源。
值得注意的是,Web应⽤程序类加载器⾏为与默认的Java 2委派模型不同。当⼀个加载类的请求被We
bappX类加载器处理时,类加载器将⾸先查看本地库,⽽⾮在查看前就委派,但是也有例外,作为JRE基本类⼀部分的类不能被覆盖,但是对与⼀些类,可以使⽤J2SE 1.4的Endorsed Standards Override机制。最后,任何包含servlet API的JAR包都将被该类加载器忽略。Tomcat 5所有其它的类加载器遵循常⽤的委派模式。具体细节请参见Tomcat 5的参考⽂档。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。