`

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

    博客分类:
  • Java
阅读更多

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

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

在不同的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下,
那么fb这个webapp中使用到javamail进行邮件发送的时候,便会出现No provider for smtp的错误。

分享到:
评论

相关推荐

    Tomcat启动顺序

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

    Tomcat启动时类加载顺序

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

    tomcat详解与启动加载顺序

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

    实现tomcat热更新class文件.docx

    在`Context`元素中,我们可以添加一个`reloadable`属性,其值设为`true`,表示Tomcat应该监视这个应用的类文件变化,并在检测到变化时自动重新加载。 ```xml ... ... ``` 2. **修改`server.xml`配置**...

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

    经过调试,作者发现可能是因为某个类的重写版本在服务器上的加载顺序优先于标准Hibernate库,使得服务器能够正确处理字符串类型的参数。而在本地,由于JAR加载顺序的不同,加载的可能是未做兼容处理的标准Hibernate...

    Tomcat加载顺序

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

    tomcat类加载器

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

    编译class不用重启tomcat

    标题“编译class不用重启tomcat”涉及到的是Java开发中的热部署技术,它允许开发者在不重启应用服务器(如Tomcat)的情况下,实时更新代码并看到变化的效果,从而极大地提高了开发效率。这篇博客可能介绍了如何使用...

    tomcat 类加载机制 —— ClassLoader

    在Tomcat中,我们可以通过配置`catalina.properties`文件和`server.xml`文件来调整类加载策略,例如设置自定义的类加载顺序或启用共享类加载器。 此外,Tomcat还支持热部署,即在不重启服务器的情况下更新Web应用的...

    class加密保护支持tomcat下web应用加密

    Hello 为java .class文件 windows java -agentlib:c:\jvm\deClass Hello deClass就是deClass.dll,注意不需要加.dll tomcat 修改tomcat的bin目录下catalina.bat set JAVA_OPTS=-agentlib:c:\jvm\deClass linux下 ...

    Eclipse Tomcat Server 加载项目

    ### Eclipse Tomcat Server 加载项目的详细步骤与配置 在开发Java Web应用时,Eclipse集成开发环境(IDE)因其强大的功能、丰富的插件支持以及友好的用户界面而被广泛使用。其中,Eclipse内置的Tomcat服务器是进行...

    如何让tomcat自动加载

    介绍了让tomcat自动加载的 代码及文件

    myeclipse下tomcat动态加载

    用户可以通过MyEclipse的服务器向导来添加、配置和管理Tomcat服务器实例。配置过程中,可以选择Tomcat的安装路径,设置端口号,以及决定是否在调试模式下运行。 2. **动态加载的设置**:在MyEclipse中,可以为...

    Linux中将Tomcat添加到守护进程

    本文将详细介绍如何将Tomcat添加到Linux的守护进程,并处理"Invalid user name 'tomcat' specified"的异常问题。 首先,我们需要设置环境变量。打开 `/etc/profile` 文件,并添加以下两行来指定Tomcat和Java的安装...

    让tomcat自动加载修改过的类和servlet

    因此,让Tomcat自动加载修改过的类和Servlet成为提高开发效率的关键需求之一。 ### 让Tomcat自动加载修改过的类和Servlet #### 知识点一:理解Tomcat的热部署机制 Tomcat默认情况下并不会自动检测到类或Servlet的...

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

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

    java类加载器-tomcat中的类加载器

    Java 类加载器是Java虚拟机(JVM)的核心组成部分,它负责将编译后的字节码文件(.class文件)加载到JVM中并转换为运行时的数据结构。Tomcat,作为广泛使用的Java Servlet容器,它自定义了一套类加载机制,以满足Web...

    Tomcat热加载Jrebel

    接着,为Tomcat服务器添加Jrebel的启动参数,使其在启动时加载Jrebel代理。最后,启动Tomcat,Jrebel就会自动监测代码变动并实现热加载。 4. **Jrebel优势**:除了提高开发效率,Jrebel还能减少由于频繁重启导致的...

Global site tag (gtag.js) - Google Analytics