`

tomcat加载类的顺序

阅读更多

/bin:存放启动和关闭tomcat的脚本文件;
/conf:存放tomcat的各种配置文件,比如:server.xml
/server/lib:存放tomcat服务器所需要的各种jar文件(jar文件只可被tomcat 服务器访问)
/server/webapps:存放tomcat自带的两个web应用:admin应用和manager应用。
/common/lib:存放tomcat服务器以及所有web应用都可以访问的jar文件夹(web和tomcat服务器都可访问此jar)
/shared/lib:存放web都可访问的jar文件。(可以被所有的web访问,但不能被tomcat访问)
/logs:存放tomcat的日志文件
/webapps:当发布web应用时,默认情况下把web应用文件放于此目录下
/work:tomcat把由jsp生成的Servlet放于此目录
另:在web应用中,WEB-Inf目录下,也可以建立lib子目录,在此子目录下可以存放各种jar文件,这些jar文件只能被当前web应用 访问。其中,在web-inf目录下的lib与classes目录,Tomcat类装载器先装载classes目录下的类,再装载lib目录下的类。因为 类同名时,classes优先。

其中jsp运行时,查找class的顺序为:项目文件夹(WEB-INF\lib)===》容器文件夹(tomcat\common\lib)==》jdk文件夹(jdk\jre\lib\ext)

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的搜寻顺序如下
-------------
/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的错误。

分享到:
评论

相关推荐

    Tomcat启动时类加载顺序

    ### Tomcat启动时类加载顺序详解 #### 一、引言 Apache Tomcat是一款开源的Servlet容器,主要用于部署Java Web应用程序。它支持最新的Servlet、JSP等规范,并且以其轻量级、简单易用的特点而受到开发者的青睐。在...

    Tomcat加载顺序

    ### Tomcat加载顺序详解 Apache Tomcat作为一款广泛使用的开源Servlet容器,其类加载机制是理解和维护基于Tomcat的应用程序的重要部分。Tomcat的类加载器遵循特定的加载顺序,确保了不同应用间的隔离性和资源的正确...

    tomcat类加载器

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

    tomcat详解与启动加载顺序

    tomcat详解与启动加载顺序 tomcat详解与启动加载顺序

    Tomcat启动顺序

    Tomcat的启动顺序涉及到多个层次的加载,从Bootstrap类开始,逐步加载系统配置、公共库、共享库以及Web应用程序。 【详细知识点】: 1. Bootstrap类: Tomcat的启动始于Bootstrap类,这是Tomcat服务器的主入口点...

    tomcat 类加载机制 —— ClassLoader

    类加载遵循“双亲委托模型”,即当一个类加载器收到加载类的请求时,它会首先委托父类加载器尝试加载,只有当父类加载器无法找到对应的类时,才会自己尝试加载。这样保证了基础类库的一致性,同时也允许Web应用覆盖...

    Java 类在 Tomcat 中是如何加载的(过程分析)

    当Tomcat加载类时,它遵循以下顺序: - 使用Bootstrap类加载器尝试加载。 - 使用System类加载器尝试加载。 - 使用Webapp类加载器加载`WEB-INF/classes`下的类。 - 使用Webapp类加载器加载`WEB-INF/lib`中的jar...

    tomcat8改了jar加载顺序的踩坑记录

    二是直接修改Tomcat的类加载策略,使其按照字母顺序加载JAR,但这可能会影响到其他应用的正确运行。 总的来说,理解Tomcat的类加载机制对于排查和解决问题至关重要。开发者应当注意,即使使用了相同版本的Tomcat和...

    tomcat 源码分析系列文档

    5. "tomcat加载类的顺序.doc":详细说明了Tomcat加载类的具体步骤和顺序,这对于理解和调试类加载问题至关重要。 6. "Tomcat源码研究.pdf":提供了一个全面的源码分析概览,可能包括了Tomcat的主要组件、设计模式...

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

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

    细说Tomcat如何打破双亲委派(有源码和图)

    在Java世界中,类加载器(ClassLoader)是Java运行时环境的重要组成部分,它负责加载类的字节码到JVM中。Tomcat作为一款广泛使用的Java应用服务器,其类加载机制有着独特的设计,特别是对Java的双亲委派模型有所突破...

    Spring+SpringMVC配置加载顺序1

    Spring 和 SpringMVC 的配置加载顺序是理解这两个框架协同工作的重要方面。首先,DispatcherServlet 是 SpringMVC 的核心组件,它扮演着请求分发者的角色,确保请求被正确地路由到相应的处理器。DispatcherServlet ...

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

    类加载的顺序为: 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/common/lib/*.jar 8. $...

    Tomcat中用web.xml控制Web应用详解

    Tomcat 中 web.xml 文件是 Web 应用的核心配置文件,负责管理 Web 应用的生命周期、Servlet 的加载顺序、Filter 的配置等。下面对 web.xml 文件中的重要元素进行详细解释。 context-param 元素 context-param 元素...

    tomcat

    Context配置包含了应用的路径、加载顺序、session配置等。 6. **日志与错误处理**:Tomcat的日志配置在`conf/logging.properties`中,可以调整日志级别和输出位置。`conf/server.xml`中的`<Valve>`元素可以用来定制...

    tomcat 学习与分析总结资料

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

    tomcat加载jar异常问题的分析与解决

    在实际操作中,结合项目实际部署情况和环境变量,逐一排查并解决上述提到的问题点,就能有效解决Tomcat加载JAR异常的问题。 需要注意的是,由于文档内容是通过OCR扫描得到的,可能存在个别字词的识别错误。因此,在...

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

    7. ** valves**:Valves是Tomcat处理请求的管道中的组件,它们按照一定的顺序处理每个请求。开发者可以通过自定义Valve来插入特定的行为。 8. ** Manager**:用于管理Web应用程序的生命周期,如部署、卸载和更新。`...

    Tomcat工作原理祥解

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

Global site tag (gtag.js) - Google Analytics