`

tomcat5常见目录分布与代表意义及其类的加载顺序

阅读更多
tomcat5常见目录分布与代表意义及其类的加载顺序

Tomcat下载地址:http://apache.freelamp.com/jakarta/tomcat-5/

/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的错误。

1
分享到:
评论

相关推荐

    how-tomcat-works中文版

    我们将了解它如何根据部署描述符(web.xml)加载和管理类路径,以及如何处理类的加载顺序和类的隔离。 第9章:session管理 Session管理是Web应用程序中维持用户状态的关键技术。Tomcat提供了多种session存储机制,...

    SpringBoot常见知识点.md

    ### SpringBoot常见知识点详解 #### 什么是SpringBoot? SpringBoot是由Spring开源组织Pivotal推出的一个简化Spring应用开发过程的框架。它通过一系列约定来减少配置量,使开发者能够更快速地搭建起一个完整的...

    java 常见的面试题

    8. **Tomcat类加载器顺序**:Bootstrap加载JDK核心类,ExtClassLoader加载扩展目录的类,AppClassLoader加载应用类路径的类,WebappClassLoader加载每个Web应用的类。 9. **接口和实现**:错误在于Ball类实现了...

    精通J2EE--Eclipse、Struts、Hibernate及Spring整合应用案例.doc

    - **Tomcat启动分析**:了解Tomcat启动时的过程和加载顺序对于调试和优化非常有帮助。 - **Tomcat目录结构**:熟悉Tomcat的目录结构有助于更好地管理Web应用。 - **创建和发布Web应用**:可以手动部署Web应用,也...

    史上最全阿里巴巴 JAVA 面试题总览(书签完整版)

    Java中的Map类及其区别 Java中的Map接口的实现类有很多,包括HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap等。HashMap是基于哈希表的Map接口实现,非线程安全。ConcurrentHashMap在Java 8中放弃了分段锁,...

    SpringBoot 20道面试题和答案.docx

    SpringBoot 的配置加载顺序一般为: 1. 从 `bootstrap.properties` 或 `bootstrap.yml` 加载配置。 2. 从 `application.properties` 或 `application.yml` 加载配置。 3. 环境变量和系统属性。 4. Command Line Args...

    java超有用的面试题目

    #### Tomcat结构与类加载器流程 - Tomcat采用层次化的类加载器体系结构。 - 类加载遵循“从下往上”的原则。 #### volatile语义与线程安全性 - `volatile`关键字保证变量的可见性和禁止指令重排序。 - 即使使用`...

    SpringBoot最新2021年面试题,高级面试题及附答案解析.md

    SpringBoot的核心配置文件主要包括`bootstrap`与`application`两类,这两类文件分别承担着不同的职责。 - **bootstrap(.yml或.properties)**:此配置文件是由父ApplicationContext加载的,并且其加载顺序优先于`...

    java面试(多个公司)

    1. **JVM类加载机制**:类加载器负责将`.class`文件加载到JVM中,包括启动类加载器、扩展类加载器和应用类加载器。 2. **垃圾回收机制**:了解JVM如何自动回收不再使用的对象所占用的内存,减少内存泄漏。 3. **...

    STRUTS 2完全学习手册源码 第1-14章

    - Struts 2中的Action类及其生命周期,包括如何编写Action类、处理请求和返回结果 3. **第三章:结果类型与结果配置** - 结果类型(Result Types)的概念,如dispatcher、stream等 - 在struts.xml中配置结果,...

    JavaJNI资料全整理含自己的常见问题总结.pdf

    1. **加载顺序**:JNI函数在被调用时,系统首先尝试从本地库中查找,如果没有找到,则会尝试动态加载。 2. **异常处理**:在JNI中抛出异常时,通常使用`jthrowable`类型,并且可以通过`ExceptionOccurred`和`...

    java (java试题)

    同步的实现方式有`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法以及`Lock`接口及其实现类。 5. **异常处理**:运行时异常与一般异常的主要区别在于运行时异常是不强制捕获的,而一般异常(检查...

    Servlet API(中文版)

    - 在`web.xml`部署描述符中,可以配置Servlet的映射、初始化参数、加载顺序等。 - `<servlet>`元素定义Servlet,`<servlet-name>`定义Servlet的名称,`<servlet-class>`指定Servlet的全限定类名。 - `...

    深入 Java Servlet 网络编程

    通过web.xml,我们可以控制Servlet的初始化参数、加载顺序等。 10. **现代Web框架与Servlet** 虽然可以直接使用Servlet编写Web应用,但现在许多现代框架如Spring MVC、Struts等都基于Servlet API,提供更高级别的...

    jsp入门教程

    - **配置环境**:设置`CATALINA_HOME`环境变量,并将Tomcat的bin目录添加到系统路径中。 - **启动服务**:通过命令行运行`startup.bat`(Windows)或`startup.sh`(Linux/Mac)来启动Tomcat服务。 #### 第1章 ...

Global site tag (gtag.js) - Google Analytics