Rumah  >  Artikel  >  Java  >  Tomcat中的几种类加载器介绍

Tomcat中的几种类加载器介绍

零下一度
零下一度asal
2017-07-24 09:26:512440semak imbas

         学习tomcat类加载器,首先得先看下JVM提供了几种类加载器,毕竟tomcat类加载器是依赖于JVM类加载器的。

         JVM类加载器:引导类加载器(bootstrapclassloader)、扩展类加载器(extension classloader)、系统类加载器(又称应用类加载器,system classloader)。引导类加载器是扩展类加载器的父加载器,而扩展类加载器又是系统类加载器的父加载器。

(1) Bootstrap Classloader 是JVM 利用JNI的方式采用C语言实现的(即它并不是Java.lang.ClassLoader的子类)。负责加载%JAVA_HOME%\lib下的类库或者是由-Xbootclasspath选项或使用-D选项指定sun.boot.class.path系统属性指定的类。

(2) Extension ClassLoader 由sun.misc.Launcher$ExtClassLoader实现,负责加载%JAVA_HOME%\jre\lib\ext中的类库或者是由系统变量java.ext.dirs指定的类库。

(3) System ClassLoader 由sum.misc.Launcher$AppClassLoader实现,负责加载java应用涉及到的类。加载器可以通过ClassLoader.getSystemClassLoader()来获取


tomcat启动时,会创建几种类加载器:

1 Bootstrap 引导类加载器 

加载JVM启动所需的类,以及标准扩展类,位于jre/lib/ext下。

2 System 系统类加载器 

加载tomcat启动的类,比如bootstrap.jar,通常在catalina.bat或者catalina.sh中指定。位于CATALINA_HOME/bin下。

3 Common 通用类加载器 

加载tomcat使用以及应用通用的一些类,位于CATALINA_HOME/lib下,比如servlet-api.jar

4 webapp 应用类加载器

每个应用在部署后,都会创建一个唯一的类加载器。该类加载器会加载位于 WEB-INF/lib下的jar文件中的class 和 WEB-INF/classes下的class文件

当应用需要到某个类时,则会按照下面的顺序进行类加载

1 使用bootstrap引导类加载器加载

2 使用system系统类加载器加载

3 使用应用类加载器在WEB-INF/classes中加载

4 使用应用类加载器在WEB-INF/lib中加载

5 使用common类加载器在CATALINA_HOME/lib中加载

 还有一点要讲下的是java文件放在Eclipse中的src文件夹下会优先jar包中的class:

这是因为Eclipse中的src文件夹中的文件java以及webContent中的JSP都会在tomcat启动时,被编译成class文件放在 WEB-INF/class 中。而Eclipse外部引用的jar包,则相当于放在 WEB-INF/lib 中。因此肯定是 java文件或者JSP文件编译出的class优先加载

另外还需注意在 CATALINA_HOME/lib 以及 WEB-INF/lib 中放置了不同版本的jar包,此时就会导致某些情况下报加载不到类的错误。

还有如果多个应用使用同一jar包文件,当放置了多份,就可能导致 多个应用间 出现类加载不到的错误。

Atas ialah kandungan terperinci Tomcat中的几种类加载器介绍. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn