`

Tomcat的class加载的优先顺序

    博客分类:
  • web
阅读更多

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.fj;
public class TestClass {
   private String NAME="风间";
}

package com.fj;
public class TestClass {
   private String NAME="小新";
}

在不同的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类加载器

    在Java中,类加载器是JVM的一部分,它的任务是将.class文件从磁盘加载到内存,并使这些类在运行时可用。类加载器遵循双亲委派模型,这意味着当一个类加载器尝试加载类时,它首先会将请求委托给其父类加载器,直到...

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

    java class reload

    3. **Tomcat自带的Class reloading** - Tomcat在开发模式下,可以通过设置`reloadable=true`在`conf/server.xml`中的`Context`元素内,启用类的热重载。但这仅适用于源代码改变后,重新编译并部署的 `.class` 文件...

    Tomcat通俗讲解

    Tomcat采用了多层类加载机制,确保不同层次的应用之间不会出现类加载冲突。以下是类加载器的基本层级结构及其加载顺序: - **Bootstrap ClassLoader**:加载Java核心类库,位于`$JAVA_HOME/jre/lib/ext/*.jar`。 - ...

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

    Tomcat 类加载器的实现主要围绕着Java的类加载机制进行,旨在确保应用之间的类隔离,并提供灵活的资源访问策略。下面我们将深入探讨这些知识点。 首先,Java的类加载机制是基于“双亲委托模型”的。当一个类加载器...

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

    6. **Classloading机制**:Tomcat的类加载机制对于理解和定制化部署非常重要。它遵循"父子类加载器"原则,理解类加载的顺序和策略对于解决类冲突问题至关重要。 7. **JMX(Java Management Extensions)**:Tomcat...

    Tomcat(二) Tomcat实现:Servlet与web.xml介绍 以及 源码分析Tomcat实现细节1

    当请求匹配到过滤器映射时,Tomcat会创建一个过滤器链,并按顺序调用每个过滤器的`doFilter()`方法。过滤器可以决定是否继续调用下一个过滤器,或者直接处理请求。 ```xml <filter-name>...

    Struts2在Tomcat容器中的加载过程

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

    Tomcat 5.0.18 ClassLoader source code insight

    在Tomcat 5.0.18中,Webapp ClassLoader会优先加载WEB-INF/classes目录下的类,然后是WEB-INF/lib目录下的JAR文件。 5. **Parent First / Child First策略**:Tomcat的ClassLoader加载策略有两种,一种是"parent ...

    Tomcat研究之ClassLoader.pdf

    2. **System ClassLoader**:通常由JVM的`java.class.path`系统属性指向,负责加载`$CATALINA_HOME/bin/bootstrap.jar`中的类库,这些类主要用于初始化Tomcat并执行主方法。 3. **Common ClassLoader**:这个类加载...

    Tomcat Web.xml 详解

    数字值表示加载顺序,值越小优先级越高。 通过以上解析可以看出,`web.xml` 文件在Java Web应用中扮演着非常重要的角色。合理地利用这些元素可以帮助我们更好地组织和管理Web应用,提高开发效率和应用性能。

    JDK Tomcat Mysql配置大全

    - **加载顺序**:`load-on-startup`指定Servlet加载的优先级,数值越小优先级越高。 #### 五、总结 通过上述步骤,可以有效地配置JDK、Tomcat5.5、Tomcat6.0以及部署MySQL驱动程序。正确的配置是成功部署Java Web...

    tomcat的配置 WEB项目发布

    Tomcat会优先加载`classes`目录下的类文件,之后才是`lib`目录下的JAR文件。 - `WEB-INF`目录下的文件对外部直接访问是不可见的,以确保安全性和整洁性。 - 在部署多个Web应用时,每个应用都需要有自己的独立目录...

    Tomcat详解

    Tomcat采用了一种层次化的类加载机制,确保每个类加载器只加载自己权限范围内的类,并遵循特定的加载顺序。这种机制保证了系统的稳定性和安全性。 1. **Bootstrap**:加载核心Java库,这些库通常位于`$JAVA_HOME/...

    Tomcat工作原理祥解.doc

    Tomcat的类加载机制遵循特定的顺序: 1. `/Web-INF/classes`:首先加载当前Web应用的类。 2. `/Web-INF/lib/*.jar`:接着加载Web应用的JAR包。 3. `Bootstrap`:加载JRE的扩展目录中的JAR。 4. `System`:加载系统...

Global site tag (gtag.js) - Google Analytics