﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-阿正的博客-随笔分类-Tomcat&amp;Jboss</title><link>http://www.blogjava.net/kentsong/category/12392.html</link><description>嘿嘿嘿...... I love Java</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 04:02:41 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 04:02:41 GMT</pubDate><ttl>60</ttl><item><title>Tomcat的class加载的优先顺序</title><link>http://www.blogjava.net/kentsong/archive/2006/06/21/54362.html</link><dc:creator>Kent</dc:creator><author>Kent</author><pubDate>Wed, 21 Jun 2006 13:34:00 GMT</pubDate><guid>http://www.blogjava.net/kentsong/archive/2006/06/21/54362.html</guid><wfw:comment>http://www.blogjava.net/kentsong/comments/54362.html</wfw:comment><comments>http://www.blogjava.net/kentsong/archive/2006/06/21/54362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kentsong/comments/commentRss/54362.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kentsong/services/trackbacks/54362.html</trackback:ping><description><![CDATA[
		<div class="postTitle">（转贴）<a href="http://blog.csdn.net/wdw004/archive/2005/09/02/469933.aspx">Tomcat的class加载的优先顺序</a><script language="javascript"></script></div>
		<div class="postText">
				<font face="宋体" size="3">加载的优先顺序一览<br /><br />1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。<br /><br />2.环境变量CLASSPATH中的jar和class文件。<br /><br />3.$CATALINA_HOME/common/classes下的class文件。<br /><br />4.$CATALINA_HOME/commons/endorsed下的jar文件。<br /><br />5.$CATALINA_HOME/commons/i18n下的jar文件。<br /><br />6.$CATALINA_HOME/common/lib 下的jar文件。<br />（JDBC驱动之类的jar文件可以放在这里，这样就可以避免在server.xml配置好数据源却出现找不到JDBC Driver的情况。）<br />7.$CATALINA_HOME/server/classes下的class文件。<br /><br />8.$CATALINA_HOME/server/lib/下的jar文件。<br /><br />9.$CATALINA_BASE/shared/classes 下的class文件。<br /><br />10.$CATALINA_BASE/shared/lib下的jar文件。<br /><br />11.各自具体的webapp /WEB-INF/classes下的class文件。<br /><br />12.各自具体的webapp /WEB-INF/lib下的jar文件。<br /><br />class的搜寻顺序如下：<br />-------------<br />Bootstrap classes of your JVM <br />System class loader classses (described above) <br />/WEB-INF/classes of your web application <br />/WEB-INF/lib/*.jar of your web application <br />$CATALINA_HOME/common/classes <br />$CATALINA_HOME/common/endorsed/*.jar <br />$CATALINA_HOME/common/i18n/*.jar <br />$CATALINA_HOME/common/lib/*.jar <br />$CATALINA_BASE/shared/classes <br />$CATALINA_BASE/shared/lib/*.jar <br />--------------<br /><br /><br />因此放在不同webapp里的class文件，会被classloader加载成不同的实例。<br />例如假设下面两个不同内容的class。分别放在不同的webapp的class目录下。<br /><br />package com.lizongbo;<br />public class TestClass {<br />  private String NAME="lizongbo";<br />}<br /><br />package com.lizongbo;<br />public class TestClass {<br />  private String NAME="li_zongbo";<br />}<br /><br />在不同的webapp得到的com.lizongbo.NAME结果是不同的，且互不影响。<br /><br />但是注意，以下包名开头的class例外：<br />javax.* <br />org.xml.sax.* <br />org.w3c.dom.* <br />org.apache.xerces.* <br />org.apache.xalan.* <br /><br />ps,注意.在各个jar中的\META-INF\MAINFEST.MF文件里Class-Path键值对，也会提供jar的加载优先顺序。<br />例如某jar的MAINFEST.MF内容如下：<br />Manifest-Version: 1.0<br />Created-By: lizongbo<br />Class-Path: commons-beanutils.jar<br />Class-Path: commons-collections.jar<br />Class-Path: commons-dbcp.jar<br />Class-Path: commons-digester.jar<br />Class-Path: commons-logging.jar<br />Class-Path: commons-pool.jar<br />Class-Path: commons-services.jar<br />Class-Path: commons-validator.jar<br />Class-Path: jakarta-oro.jar<br />Main-Class: com.lizongbo.MyTestClass<br /><br /><br />那么在加载这个jar的时候，会先在此jar所在目录下依次先加载commons-beanutils.jar，commons-collections.jar。。。等jar文件。<br /><br />在不同的地方放置jar和class可能会产生意想不到的后果,，尤其是不同版本的jar文件，因此在实际应用部署web应用时候要特别留心.<br /><br /><br />例如 使用javamail常见的一个出错信息:<br />javax.mail.NoSuchProviderException: No provider for smtp<br />其真实原因就很可能如下:<br />在不同的加载jar的目录下放置了不同版本的mail.jar,比如一个是javamail1.3.1的mail.jar<br />在D:\jakarta-tomcat-5.5.8\common\lib下,而另外一个是javamail1.3.2的mail.jar在<br />D:\jakarta-tomcat-5.5.8\webapps\lizongbo\WEB-INF/lib下,<br />那么lizongbo这个webapp中使用到javamail进行邮件发送的时候，便会出现No provider for smtp的错误</font>
		</div>
<img src ="http://www.blogjava.net/kentsong/aggbug/54362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kentsong/" target="_blank">Kent</a> 2006-06-21 21:34 <a href="http://www.blogjava.net/kentsong/archive/2006/06/21/54362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>