`

Tomcat和JSP加载类的顺序

阅读更多

Tomcat的class加载的优先顺序一览

1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。

2.环境变量CLASSPATH中的jar和class文件。

3.$CATALINA_HOME/common/classes下的class文件。

4.$CATALINA_HOME/commons/endorsed下的jar文件。

5.$CATALINA_HOME/commons/i18n下的jar文件。

6.$CATALINA_HOME/common/lib 下的jar文件。
(JDBC驱动之类的jar文件可以放在这里,这样就可以避免在server.xml配置好数据源却出现找不到JDBC Driver的情况。)
7.$CATALINA_HOME/server/classes下的class文件。

8.$CATALINA_HOME/server/lib/下的jar文件。

9.$CATALINA_BASE/shared/classes 下的class文件。

10.$CATALINA_BASE/shared/lib下的jar文件。

11.各自具体的webapp /WEB-INF/classes下的class文件。

12.各自具体的webapp /WEB-INF/lib下的jar文件。

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
--------------


因此放在不同webapp里的class文件,会被classloader加载成不同的实例。
例如假设下面两个不同内容的class。分别放在不同的webapp的class目录下。

package com.lizongbo;
public class TestClass {
private String NAME="lizongbo";
}

package com.lizongbo;
public class TestClass {
private String NAME="li_zongbo";
}

在不同的webapp得到的com.lizongbo.NAME结果是不同的,且互不影响。

但是注意,以下包名开头的class例外:
javax.*
org.xml.sax.*
org.w3c.dom.*
org.apache.xerces.*
org.apache.xalan.*

ps,注意.在各个jar中的\META-INF\MAINFEST.MF文件里Class-Path键值对,也会提供jar的加载优先顺序。
例如某jar的MAINFEST.MF内容如下:
Manifest-Version: 1.0
Created-By: lizongbo
Class-Path: commons-beanutils.jar
Class-Path: commons-collections.jar
Class-Path: commons-dbcp.jar
Class-Path: commons-digester.jar
Class-Path: commons-logging.jar
Class-Path: commons-pool.jar
Class-Path: commons-services.jar
Class-Path: commons-validator.jar
Class-Path: jakarta-oro.jar
Main-Class: com.lizongbo.MyTestClass


那么在加载这个jar的时候,会先在此jar所在目录下依次先加载commons-beanutils.jar,commons-collections.jar。。。等jar文件。

在不同的地方放置jar和class可能会产生意想不到的后果,,尤其是不同版本的jar文件,因此在实际应用部署web应用时候要特别留心.

例如 使用javamail常见的一个出错信息:
javax.mail.NoSuchProviderException: No provider for smtp
其真实原因就很可能如下:
在不同的加载jar的目录下放置了不同版本的mail.jar,比如一个是javamail1.3.1的mail.jar
在D:\jakarta-tomcat-5.5.8\common\lib下,而另外一个是javamail1.3.2的mail.jar在
D:\jakarta-tomcat-5.5.8\webapps\lizongbo\WEB-INF/lib下,
那么lizongbo这个webapp中使用到javamail进行邮件发送的时候,便会出现No provider for smtp的错误。

详情见google:http://www.google.com/search?hl=zh-CN&inlang=zh-CN&newwindow=1&q=javax.mail.NoSuchProviderException%3A+smtp&btnG=%E6%90%9C%E7%B4%A2&lr=lang_zh-CN

其它详情可参考:
http://java.sun.com/j2se/1.4.2/docs/guide/jar/jar.html#JAR%20Manifest

http://jakarta.apache.org/tomcat/tomcat-5.5-doc/class-loader-howto.html

分享到:
评论

相关推荐

    java初学者必看

    16.3.2 JDBC常见接口和类 16.3.3 JDBC数据库连接步骤 16.3.4 加载JDBC驱动程序 16.3.5 获取Connection连接对象 16.4 Java与各种数据库连接 16.5 本章习题 第17章 Java Web应用——JSP 17.1 JSP技术概述 17.2...

    Java面试宝典2020修订版V1.0.1.doc

    19、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 38 20、页面传递对象的方法? 38 21、Cookied和session区别? 38 22、Filter的生命周期与执行过程 38 23、Tomcat系统内存怎么配置 39 24、JSTL标签库...

    java面试题

    Struts2只是起到一个数据接收和转接的功能,就是Controller控制器,而传来数据的页面叫view显示层,Struts2将数据提交给进行处理的类叫Model模型层,专门进行数据处理和数据库的连接。 heap和stack有什么区别? 答:...

    Java数据编程指南

    数据定义 基本数据操作 数据完整性 表达式 连接 合并 子...Tomcat安装和配置 JRun 3.0安装和配置 安装检索 附录E 在WebLogic 6.0上配置并部署EJB 设置配置属性 生成EJB容器类 加载...

    java 面试题 总结

    以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 public class ThreadTest1{ private int j; public static void main(String args[]){ ThreadTest1 tt=new ThreadTest1(); Inc inc=tt.new Inc(); ...

    Java开发技术大全 电子版

    9.2用Class类来加载对象289 9.3使用getClass()方法获取类信息290 9.4使用类标记292 9.5使用关键字instanceof判断所属类292 9.6利用反射获取运行时类信息293 9.6.1使用isInstance()方法判断所属类294 9.6.2获取...

    超级有影响力霸气的Java面试题大全文档

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    java基础题 很全面

    以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 31 6. 写一段Jdbc连Oracle的程序. 32 7. 编码实现内部类 34 8. 输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按...

    Java面试宝典2010版

    17、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 18、MVC的各个部分都有那些技术来实现?如何实现? 19、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的...

    Spring.3.x企业应用开发实战(完整版).part2

    15.4.3 JSP和JSTL 15.4.4 模板视图 15.4.5 Excel 15.4.6 PDF 15.4.7 输出XML 15.4.8 输出JSON 15.4.9 使用XmlViewResolver 15.4.10 使用ResourceBundle ViewResolver 15.4.11 混合使用多种视图技术 15.5 本地化解析 ...

    Spring3.x企业应用开发实战(完整版) part1

    15.4.3 JSP和JSTL 15.4.4 模板视图 15.4.5 Excel 15.4.6 PDF 15.4.7 输出XML 15.4.8 输出JSON 15.4.9 使用XmlViewResolver 15.4.10 使用ResourceBundle ViewResolver 15.4.11 混合使用多种视图技术 15.5 本地化解析 ...

    最新Java面试宝典pdf版

    17、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 90 18、MVC的各个部分都有那些技术来实现?如何实现? 90 19、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种...

    Java面试笔试资料大全

    17、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 90 18、MVC的各个部分都有那些技术来实现?如何实现? 90 19、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种...

    Java面试宝典2012版

    17、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 90 18、MVC的各个部分都有那些技术来实现?如何实现? 90 19、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个...

    JAVA面试宝典2010

    17、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 90 18、MVC的各个部分都有那些技术来实现?如何实现? 90 19、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种...

    Java面试宝典-经典

    17、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 90 18、MVC的各个部分都有那些技术来实现?如何实现? 90 19、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种...

    java面试题大全(2012版)

    17、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 90 18、MVC的各个部分都有那些技术来实现?如何实现? 90 19、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种...

Global site tag (gtag.js) - Google Analytics