本文讲述了Tomcat的classloading的逻辑。
1. 之所以要讲Classloading的事情,关键还是解决在开发过程中碰到的class找不到,一些资源文件找不到的问题。要解决这样的问题,就必须理解Tomcat的classloader会到什么地方去找class,找资源。
2. 首先是一个总结,告诉我们应该怎样防止自己的class和资源:
(1) For classes and resources specific to a particular web application, place unpacked classes and resources under /WEB-INF/classes of your web application archive, or place JAR files containing those classes and resources under /WEB-INF/lib of your web application archive.
(2) For classes and resources that must be shared across all web applications, place unpacked classes and resources under $CATALINA_BASE/shared/classes, or place JAR files containing those classes and resources under $CATALINA_BASE/shared/lib.
大体的意思就是,如果资源和class文件只是for一个web app的,那么请把class文件,资源文件放到/WEB-INF/classes目录下,如果已经将class或资源文件打成了jar包,或是一些第三方的jar包,请放到/WEB-INF/lib目录下;如果这些class和资源文件要共享给其他的web app,请把他们放到$CATALINA_BASE/shared/classes, $CATALINA_BASE/shared/lib目录下。这里,$CATALINA_BASE一般就是$CATALINA_HOME,只不过的当我们启动了多个Tomcat的时候,需要用到$CATALINA_BASE,因为多个Tomcat他们的$CATALINA_HOME不一定一样。
3. 然后文章就详细描述了Tomcat的一些classloader,和他们的逻辑,从而也就解释了上面的总结,可以看到最后的webappx这种classesloader就会负责load某个webapp中的资源,而有一个叫做Shared的classloader就会load放在$CATALINA_BASE/shared目录下的资源。这就是为什么我们把东西放在这些地方就能被发现和load的原因。具体可以看本文档,讲的很详细,包括Tomcat下面common目录下的东西是由哪个classloader load的(就是一个名为Common的classloader),等等。比如那个名为Catalina的classloader就负责load tomcat自己的classes,所以这个classloader对于webapp来说是不可见的。这里就是Tomcat中的classloader的关系图:
1. 之所以要讲Classloading的事情,关键还是解决在开发过程中碰到的class找不到,一些资源文件找不到的问题。要解决这样的问题,就必须理解Tomcat的classloader会到什么地方去找class,找资源。
2. 首先是一个总结,告诉我们应该怎样防止自己的class和资源:
(1) For classes and resources specific to a particular web application, place unpacked classes and resources under /WEB-INF/classes of your web application archive, or place JAR files containing those classes and resources under /WEB-INF/lib of your web application archive.
(2) For classes and resources that must be shared across all web applications, place unpacked classes and resources under $CATALINA_BASE/shared/classes, or place JAR files containing those classes and resources under $CATALINA_BASE/shared/lib.
大体的意思就是,如果资源和class文件只是for一个web app的,那么请把class文件,资源文件放到/WEB-INF/classes目录下,如果已经将class或资源文件打成了jar包,或是一些第三方的jar包,请放到/WEB-INF/lib目录下;如果这些class和资源文件要共享给其他的web app,请把他们放到$CATALINA_BASE/shared/classes, $CATALINA_BASE/shared/lib目录下。这里,$CATALINA_BASE一般就是$CATALINA_HOME,只不过的当我们启动了多个Tomcat的时候,需要用到$CATALINA_BASE,因为多个Tomcat他们的$CATALINA_HOME不一定一样。
3. 然后文章就详细描述了Tomcat的一些classloader,和他们的逻辑,从而也就解释了上面的总结,可以看到最后的webappx这种classesloader就会负责load某个webapp中的资源,而有一个叫做Shared的classloader就会load放在$CATALINA_BASE/shared目录下的资源。这就是为什么我们把东西放在这些地方就能被发现和load的原因。具体可以看本文档,讲的很详细,包括Tomcat下面common目录下的东西是由哪个classloader load的(就是一个名为Common的classloader),等等。比如那个名为Catalina的classloader就负责load tomcat自己的classes,所以这个classloader对于webapp来说是不可见的。这里就是Tomcat中的classloader的关系图:
Bootstrap
|
System
|
Common
/ \
Catalina Shared
/ \
Webapp1 Webapp2 ...
|
System
|
Common
/ \
Catalina Shared
/ \
Webapp1 Webapp2 ...
4. 最后文档给出了一个非常有用的东西,也就是对于一个web app来说,tomcat是按照如下顺序来寻找class和资源的:
-
Bootstrap classes of your JVM
System class loader classses (described above)
/WEB-INF/classes of your web application
/WEB-INF/lib/*.jar of your web application
$CATALINA_HOME/common/classes
$CATALINA_HOME/common/endorsed/*.jar
$CATALINA_HOME/common/i18n/*.jar
$CATALINA_HOME/common/lib/*.jar
$CATALINA_BASE/shared/classes
$CATALINA_BASE/shared/lib/*.jar