`

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

分享到:
评论

相关推荐

    Tomcat启动时类加载顺序

    Tomcat通过自定义的类加载器实现了特定的类加载顺序,以确保能够正确处理不同来源的类文件,避免类的重复加载和类版本冲突问题。以下是Tomcat启动过程中类加载的具体顺序: #### 三、类加载顺序详述 1. **Bootstrap...

    tomcat类加载器

    类加载器遵循双亲委派模型,这意味着当一个类加载器尝试加载类时,它首先会将请求委托给其父类加载器,直到到达顶层的Bootstrap ClassLoader,如果父类加载器无法找到该类,子类加载器才会尝试自己加载。 在Tomcat...

    Tomcat组成及工作原理借鉴.pdf

    Tomcat 组成及工作原理借鉴 Tomcat 是一个开源的 Web 服务器软件,由 ...Tomcat 是一个功能强大和灵活的 Web 服务器软件,提供了一个完善的类加载机制和配置机制,使得开发人员可以快速地开发和部署 Web 应用程序。

    Tomcat 类加载器的实现方法及实例代码

    StandardClassLoader与URLClassLoader类似,而WebappClassLoader则按照Servlet规范的顺序加载类。 在初始化过程中,如在Bootstrap的initClassLoaders方法中,会创建并设置这些类加载器。例如,commonLoader是通过...

    Tomcat源码apache-tomcat-8.5.47-src.zip

    Tomcat作为Servlet容器,负责加载并执行Servlet,同时处理JSP的编译和执行过程。 Tomcat的源码结构复杂,主要分为以下几个关键部分: 1. **Catalina**:这是Tomcat的核心组件,负责管理Web应用程序,包括加载、...

    Tomcat帮助文档全集

    例如,当遇到类加载问题时,API文档可以帮助理解类的生命周期和加载顺序;在性能瓶颈分析时,开发向导则能指导如何调整线程池大小、缓存设置等。对于初学者,这些文档能提供系统的学习路径,对于经验丰富的开发者,...

    Tomcat工作原理祥解

    类加载顺序:Web应用内部的`/WEB-INF/classes`,`/WEB-INF/lib/*.jar`,Bootstrap,System,Common,Shared。 **四、`server.xml`配置解析** `server.xml`是Tomcat的核心配置文件,定义了服务器的行为和服务组件:...

    Spring+SpringMVC配置加载顺序1

    Spring 和 SpringMVC 的配置加载顺序是理解这两个框架协同工作的重要方面。...理解这些加载顺序和配置方式对于调试和优化Spring应用的性能至关重要,因为它们直接影响到Spring容器的初始化以及请求的处理流程。

    Struts2在Tomcat容器中的加载过程

    理解Struts2在Tomcat中的加载过程有助于我们更好地进行Web应用开发和故障排查。 首先,让我们深入了解一下Struts2的核心组件: 1. **Filter Dispatcher**:Struts2的核心是`FilterDispatcher`,它是一个Servlet...

    apache-tomcat-9.0.34-src.zip

    7. **common`, `server`, `shared`:这些是类库目录,分别对应于Tomcat的全局、服务器特定和共享类库,允许自定义配置加载顺序。 8. **build**:构建相关的文件和脚本,如Ant构建脚本,用于编译和打包Tomcat。 9. **...

    tomcat8源码-eclipse工程

    这涉及到Web-INF/classes和lib目录的加载顺序,以及“common”、“catalina”、“shared”类加载器的角色。 5. **Servlet生命周期**:在Eclipse工程中,理解Servlet的初始化、服务、销毁过程,以及如何通过注解或...

    《深入剖析 Tomcat》PDF版本下载.txt

    - **Jasper**:Tomcat自带的一个JSP编译器,能够将JSP页面转换成Servlet类,提高JSP页面的执行效率。 - **Valve**:Valve是容器级别的扩展点,可以通过配置文件添加自定义逻辑到Tomcat的处理流程中。 ### 三、...

    tomcat 学习与分析总结资料

    理解类加载顺序和隔离机制,能避免类冲突,保证应用的正常运行。 5. **Tomcat权威指南** "Tomcat权威指南"通常涵盖Tomcat的安装、配置、安全管理、集群、连接池、日志和性能调优等方面。阅读这本书可以系统地学习...

    tomcat的工作原理

    此外,通过实现javax.servlet.Servlet接口,我们可以定义一个简单的Servlet,由Tomcat负责加载和执行。 五、结论 通过本文的分析,我们不仅深入了解了Tomcat的工作原理,还学习了其各个组件的作用和相互关系。...

    Tomcat研究之ClassLoader.pdf

    按照双亲委派模型,每个子类加载器都会先让父类加载器尝试加载类,只有当父类加载器无法加载时,子类加载器才会尝试自己加载。这种方式有效地防止了类的重复加载,并且增强了系统的稳定性和安全性。 3. **WebApp ...

    Tomcat7 源码Eclipse工程

    Tomcat7源码还涉及到了类加载机制,它采用了自定义的类加载器,如`CatalinaClassLoader`和`SharedClassLoader`,理解这些类加载器的工作方式有助于解决类冲突和加载顺序问题。 此外,Tomcat的安全管理也是重要一环...

    Tomcat通俗讲解

    加载类和资源的具体顺序如下: 1. `/Web-INF/classes` 2. `/Web-INF/lib/*.jar` 3. `Bootstrap` 4. `System` 5. `$CATALINA_HOME/common/classes` 6. `$CATALINA_HOME/common/endores/*.jar` 7. `$CATALINA_HOME/...

    tomcat-7.0.56 接口说明文档

    Tomcat会按照特定顺序启动和停止Servlet,以及初始化和销毁相关的资源。开发者可以通过实现`javax.servlet.ServletContextListener`来监听这些生命周期事件,以便在启动时进行初始化操作,关闭时进行清理工作。 ...

    《深入剖析Tomcat》的光盘源码

    它遵循"父子类加载器"原则,理解类加载的顺序和策略对于解决类冲突问题至关重要。 7. **JMX(Java Management Extensions)**:Tomcat利用JMX提供管理和监控功能,允许用户通过JMX代理远程控制Tomcat,监控其运行...

Global site tag (gtag.js) - Google Analytics