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.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的错误。
- 浏览: 606637 次
- 性别:
- 来自: 深圳
-
文章分类
- 全部博客 (300)
- Web前端 (27)
- Java疑难 (60)
- 面试 (59)
- 汇编语言 (1)
- 计算机组成原理 (2)
- 操作系统 (3)
- 计算机网络 (6)
- C/C++疑难 (9)
- SSH (2)
- Web开发 (15)
- 故障 (3)
- 软件开发 (16)
- Portal开发 (1)
- 后台开发 (6)
- 数据库 (35)
- 设计模式 (4)
- 数据结构与算法 (4)
- Linux (3)
- 项目管理 (10)
- 多线程 (12)
- 嵌入式 (9)
- 网络编程 (4)
- 架构设计 (20)
- 软件工具技巧 (7)
- 并行并发 (4)
- 窗口编程 (7)
- 串口编程 (0)
- Flex (2)
- 协议 (1)
- 通讯方式 (4)
- 性能分析优化 (5)
- 测试相关 (4)
- 海量数据处理 (2)
- JAVA核心技术 (10)
- SOA (3)
- 攻略规划 (1)
- 爬虫/搜索 (2)
- 正则表达式 (1)
- A Comparison Of NoSQL Database Management Systems And Models (1)
最新评论
-
charles751:
分析的很好!但有一点:只要同步组合操作就可以了,不一定非要sy ...
Vector 是线程安全的? -
S346618898:
core Java中有一段:Vector类对自己的所有可修改方 ...
Vector 是线程安全的? -
code_cj:
基本上明白了.但执行顺是否应该是/etc/profile -& ...
profile bashrc bash_profile之间的区别和联系 -
xd2008ck:
各自有各自的场景吧楼主不要太激进了
Vector 是线程安全的? -
zwt2001267:
写的不错,赞一个
Vector 是线程安全的?
发表评论
-
file.encoding
2015-07-23 23:43 2534参考链接 http://blog. ... -
java常用工具
2015-03-30 17:05 795jpsjstatjstackjinfojmap -
后台线程(守护线程)
2014-04-09 23:42 1423所谓的后台线程,是指在程序运行的时候在后台提供一种通用服务的 ... -
Spring配置文件xsi:schemaLocation无法解析导致启动失败的解决方案
2014-03-27 16:59 3058来源http://www.jnan.org/archives ... -
Java 内存模型
2014-01-08 10:05 701Java 内存模型 转自WIKI,自由的百科全书 跳转到 ... -
抽象类与接口选择
2013-12-06 00:20 920从设计理念层面看 abst ... -
javac和java的路径问题
2013-11-03 22:57 5757javac和java的路径问题 ... -
Java调用dll的路径问题解决
2013-10-18 00:37 2747前言:一般我们在用java写jni类库的时候,总是得把生成的 ... -
Java Ant build.xml详解
2013-07-21 23:52 9661、什么是antant是构建 ... -
Java疑难点总结
2013-06-07 02:41 11171.类加载和初始化 加载——>连接(验证-> ... -
Java 虚拟机是如何判定两个 Java 类是相同
2013-05-27 17:17 1162Java 虚拟机不仅要看类的全名是否相同,还要看加载此类的 ... -
java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError的区别
2013-05-21 11:05 986这2个东西应该是java里很常见,很简单,他们都和clas ... -
深入探讨 Java 类加载器
2013-05-21 11:06 848参考 深入探讨 Java 类加载器 http://ww ... -
深入探讨 Java 类加载器
2013-05-20 15:51 817摘自http://www.ibm.com/develope ... -
深入探讨 Java 类加载器
2013-05-20 15:48 977<!--[if !mso]> <styl ... -
final变量需要显示初始化
2013-05-20 00:15 978final int f = 10;//final in ... -
try-catch-finally中return的执行情况
2013-05-18 12:04 1787public class -
Java远程通讯可选技术及原理
2013-05-13 11:13 982源自http://www.blogjava.net/Blue ... -
Java EJB、CORBA、Webservices分布式通信基本原理及特点
2013-05-13 10:19 15281. Java远程调用的特点是什么 2. Java ... -
java传参是传值还是传引用
2013-04-28 00:44 1379个人觉得java是传值,当参数类型是基本类型,复制的是值,而 ...
相关推荐
### Tomcat启动时类加载顺序详解 #### 一、引言 Apache Tomcat是一款开源的Servlet容器,主要用于部署Java Web应用程序。它支持最新的Servlet、JSP等规范,并且以其轻量级、简单易用的特点而受到开发者的青睐。在...
在Java中,类加载器是JVM的一部分,它的任务是将.class文件从磁盘加载到内存,并使这些类在运行时可用。类加载器遵循双亲委派模型,这意味着当一个类加载器尝试加载类时,它首先会将请求委托给其父类加载器,直到...
类加载的顺序为: 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. $...
3. **Tomcat自带的Class reloading** - Tomcat在开发模式下,可以通过设置`reloadable=true`在`conf/server.xml`中的`Context`元素内,启用类的热重载。但这仅适用于源代码改变后,重新编译并部署的 `.class` 文件...
Tomcat采用了多层类加载机制,确保不同层次的应用之间不会出现类加载冲突。以下是类加载器的基本层级结构及其加载顺序: - **Bootstrap ClassLoader**:加载Java核心类库,位于`$JAVA_HOME/jre/lib/ext/*.jar`。 - ...
Tomcat 类加载器的实现主要围绕着Java的类加载机制进行,旨在确保应用之间的类隔离,并提供灵活的资源访问策略。下面我们将深入探讨这些知识点。 首先,Java的类加载机制是基于“双亲委托模型”的。当一个类加载器...
6. **Classloading机制**:Tomcat的类加载机制对于理解和定制化部署非常重要。它遵循"父子类加载器"原则,理解类加载的顺序和策略对于解决类冲突问题至关重要。 7. **JMX(Java Management Extensions)**:Tomcat...
当请求匹配到过滤器映射时,Tomcat会创建一个过滤器链,并按顺序调用每个过滤器的`doFilter()`方法。过滤器可以决定是否继续调用下一个过滤器,或者直接处理请求。 ```xml <filter-name>...
理解Struts2在Tomcat中的加载过程有助于我们更好地进行Web应用开发和故障排查。 首先,让我们深入了解一下Struts2的核心组件: 1. **Filter Dispatcher**:Struts2的核心是`FilterDispatcher`,它是一个Servlet...
在Tomcat 5.0.18中,Webapp ClassLoader会优先加载WEB-INF/classes目录下的类,然后是WEB-INF/lib目录下的JAR文件。 5. **Parent First / Child First策略**:Tomcat的ClassLoader加载策略有两种,一种是"parent ...
2. **System ClassLoader**:通常由JVM的`java.class.path`系统属性指向,负责加载`$CATALINA_HOME/bin/bootstrap.jar`中的类库,这些类主要用于初始化Tomcat并执行主方法。 3. **Common ClassLoader**:这个类加载...
数字值表示加载顺序,值越小优先级越高。 通过以上解析可以看出,`web.xml` 文件在Java Web应用中扮演着非常重要的角色。合理地利用这些元素可以帮助我们更好地组织和管理Web应用,提高开发效率和应用性能。
- **加载顺序**:`load-on-startup`指定Servlet加载的优先级,数值越小优先级越高。 #### 五、总结 通过上述步骤,可以有效地配置JDK、Tomcat5.5、Tomcat6.0以及部署MySQL驱动程序。正确的配置是成功部署Java Web...
Tomcat会优先加载`classes`目录下的类文件,之后才是`lib`目录下的JAR文件。 - `WEB-INF`目录下的文件对外部直接访问是不可见的,以确保安全性和整洁性。 - 在部署多个Web应用时,每个应用都需要有自己的独立目录...
Tomcat采用了一种层次化的类加载机制,确保每个类加载器只加载自己权限范围内的类,并遵循特定的加载顺序。这种机制保证了系统的稳定性和安全性。 1. **Bootstrap**:加载核心Java库,这些库通常位于`$JAVA_HOME/...