在运行时,Servlet容器的类加载器先加载classes目录下的类,再加载lib目录下的JAR文件中的类。因此,如果两个目录下存在同名的类,classes目录下的类具有优先权。

我们注意到Tomcat的安装目录下也有一个lib目录,这个与Web应用中的lib目录的区别在于:
Tomcat的lib子目录:存放的JAR文件不仅能被Tomcat访问,还能被所有在Tomcat中发布的JavaWeb应用访问。
JavaWeb应用的lib子目录:存放的JAR文件只能被当前JavaWeb应用访问。
假如Tomcat类加载器要加载一个MyClass的类,它会按照以下先后顺序到各个目录中去查找MyClass的class文件,直到找到为止,如果所有目录中都不存在MyClass.class的文件,则会抛出异常:
1、在JavaWeb应用的WEB-INF/classes中查找MyClass.class文件。
2、在JavaWeb应用的 WEB-INF/lib目录下的JAR文件中查找MyClass.class文件。
3、在Tomcat的lib子目录下直接查找MyClass.class文件。

4、在Tomcat的lib子目录下JAR的文件中查找MyClass.class文件。


Note:
Tomcat6.x与Tomcat5.x的目录结构有所区别。在Tomcat5.x版本中,Tomcat允许在server/lib目录、common/lib和shared/lib目录下存放JAR文件,这3个目录的区别在于:
在server/lib目录下的JAR文件只可被Tomcat访问。
在shared/lib目录下的JAR文件可以被所有的JavaWeb应用访问,但不能被Tomcat访问。
在common/lib目录下的JAR文件可以被Tomcat和所有JavaWeb应用访问。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐