/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的错误。
分享到:
相关推荐
我们将了解它如何根据部署描述符(web.xml)加载和管理类路径,以及如何处理类的加载顺序和类的隔离。 第9章:session管理 Session管理是Web应用程序中维持用户状态的关键技术。Tomcat提供了多种session存储机制,...
### SpringBoot常见知识点详解 #### 什么是SpringBoot? SpringBoot是由Spring开源组织Pivotal推出的一个简化Spring应用开发过程的框架。它通过一系列约定来减少配置量,使开发者能够更快速地搭建起一个完整的...
8. **Tomcat类加载器顺序**:Bootstrap加载JDK核心类,ExtClassLoader加载扩展目录的类,AppClassLoader加载应用类路径的类,WebappClassLoader加载每个Web应用的类。 9. **接口和实现**:错误在于Ball类实现了...
- **Tomcat启动分析**:了解Tomcat启动时的过程和加载顺序对于调试和优化非常有帮助。 - **Tomcat目录结构**:熟悉Tomcat的目录结构有助于更好地管理Web应用。 - **创建和发布Web应用**:可以手动部署Web应用,也...
Java中的Map类及其区别 Java中的Map接口的实现类有很多,包括HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap等。HashMap是基于哈希表的Map接口实现,非线程安全。ConcurrentHashMap在Java 8中放弃了分段锁,...
SpringBoot 的配置加载顺序一般为: 1. 从 `bootstrap.properties` 或 `bootstrap.yml` 加载配置。 2. 从 `application.properties` 或 `application.yml` 加载配置。 3. 环境变量和系统属性。 4. Command Line Args...
#### Tomcat结构与类加载器流程 - Tomcat采用层次化的类加载器体系结构。 - 类加载遵循“从下往上”的原则。 #### volatile语义与线程安全性 - `volatile`关键字保证变量的可见性和禁止指令重排序。 - 即使使用`...
SpringBoot的核心配置文件主要包括`bootstrap`与`application`两类,这两类文件分别承担着不同的职责。 - **bootstrap(.yml或.properties)**:此配置文件是由父ApplicationContext加载的,并且其加载顺序优先于`...
1. **JVM类加载机制**:类加载器负责将`.class`文件加载到JVM中,包括启动类加载器、扩展类加载器和应用类加载器。 2. **垃圾回收机制**:了解JVM如何自动回收不再使用的对象所占用的内存,减少内存泄漏。 3. **...
- Struts 2中的Action类及其生命周期,包括如何编写Action类、处理请求和返回结果 3. **第三章:结果类型与结果配置** - 结果类型(Result Types)的概念,如dispatcher、stream等 - 在struts.xml中配置结果,...
1. **加载顺序**:JNI函数在被调用时,系统首先尝试从本地库中查找,如果没有找到,则会尝试动态加载。 2. **异常处理**:在JNI中抛出异常时,通常使用`jthrowable`类型,并且可以通过`ExceptionOccurred`和`...
同步的实现方式有`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法以及`Lock`接口及其实现类。 5. **异常处理**:运行时异常与一般异常的主要区别在于运行时异常是不强制捕获的,而一般异常(检查...
- 在`web.xml`部署描述符中,可以配置Servlet的映射、初始化参数、加载顺序等。 - `<servlet>`元素定义Servlet,`<servlet-name>`定义Servlet的名称,`<servlet-class>`指定Servlet的全限定类名。 - `...
通过web.xml,我们可以控制Servlet的初始化参数、加载顺序等。 10. **现代Web框架与Servlet** 虽然可以直接使用Servlet编写Web应用,但现在许多现代框架如Spring MVC、Struts等都基于Servlet API,提供更高级别的...
- **配置环境**:设置`CATALINA_HOME`环境变量,并将Tomcat的bin目录添加到系统路径中。 - **启动服务**:通过命令行运行`startup.bat`(Windows)或`startup.sh`(Linux/Mac)来启动Tomcat服务。 #### 第1章 ...