最近项目中遇到在Tomcat7.0.26中类加载顺序不稳定的情况,github上拉了源码看了下搞明白了。项目中的问题是,我们可以通过字母顺序定义jar文件在webapp\WEB-INF\lib下的加载顺序,但是在tomcat\lib\ext下就不灵了。其实问题在于这两个位置的jar, tomcat是用的不同的classloader去加载的,所以结果自然不同。
对于common和system class,tomcat使用的是org.apache.catalina.startup.ClassLoaderFactory产生的classloader,入口在Bootstrap.initClassLoaders()。这个classloader里面遍历文件夹下的jar文件时使用的是java api: File.list()。看javadoc对顺序的解释。
* <p> There is no guarantee that the name strings in the resulting array * will appear in any specific order; they are not, in particular, * guaranteed to appear in alphabetical order.
而在WebappClassloader中,tomcat对于File.list()取到的列表又做了一次字母顺序排序。
org.apache.naming.resources.FileDirContext
protected List<NamingEntry> list(File file) { List<NamingEntry> entries = new ArrayList<NamingEntry>(); if (!file.isDirectory()) return entries; String[] names = file.list(); if (names==null) { /* Some IO error occurred such as bad file permissions. Prevent a NPE with Arrays.sort(names) */ log.warn(sm.getString("fileResources.listingNull", file.getAbsolutePath())); return entries; } Arrays.sort(names); // Sort alphabetically NamingEntry entry = null; ......
相关推荐
### Tomcat加载顺序详解 Apache Tomcat作为一款广泛使用的开源Servlet容器,其类加载机制是理解和维护基于Tomcat的应用程序的重要部分。Tomcat的类加载器遵循特定的加载顺序,确保了不同应用间的隔离性和资源的正确...
### Tomcat启动时类加载顺序详解 #### 一、引言 Apache Tomcat是一款开源的Servlet容器,主要用于部署Java Web应用程序。它支持最新的Servlet、JSP等规范,并且以其轻量级、简单易用的特点而受到开发者的青睐。在...
在Tomcat中,我们可以通过配置`catalina.properties`文件和`server.xml`文件来调整类加载策略,例如设置自定义的类加载顺序或启用共享类加载器。 此外,Tomcat还支持热部署,即在不重启服务器的情况下更新Web应用的...
Bootstrap类加载器完成后,Tomcat会使用系统类加载器(System ClassLoader)加载服务器的全局配置文件,如`server.xml`。这个文件定义了Tomcat的整体架构,包括服务(Service)、连接器(Connector)和引擎(Engine)等组件...
5. **Parent First / Child First策略**:Tomcat的ClassLoader加载策略有两种,一种是"parent first",另一种是"child first"。默认情况下,Tomcat采用"parent first"策略,即Webapp ClassLoader先尝试让上级Loader...
1. **加载顺序**:在Tomcat中,类的加载遵循特定的顺序。通常情况下,每个子类加载器会先尝试从自己的类路径中加载类,如果找不到,则会向上委托给父类加载器进行加载。这种委托模式确保了类的单一性和安全性。 2. ...
例如,可以通过修改`common.loader`、`shared.loader`和`context.loader`属性来改变类的加载顺序和来源。 在深入研究"DevLoader"之前,需要查看压缩包内的具体文件,例如org目录下可能包含与DevLoader相关的源代码...
Tomcat的类加载顺序通常遵循以下规则: 1. 尝试从当前Web应用的WEB-INF/classes目录和WEB-INF/lib下的jar文件加载。 2. 如果找不到,会委托给上一级的ClassLoader,通常是Common ClassLoader,加载全局共享的类库。 ...
6. **优化的加载顺序**: Tomcat通过自定义加载顺序,使得应用可以覆盖服务器级别的类库,从而实现了更灵活的部署和扩展。 `classloader2.vsd`文件可能是类加载器层次结构的Visio绘图文件,它能直观地展示上述类加载...
以下是类加载器的基本层级结构及其加载顺序: - **Bootstrap ClassLoader**:加载Java核心类库,位于`$JAVA_HOME/jre/lib/ext/*.jar`。 - **System ClassLoader**:加载用户自定义的类和类路径中的类库。 - **...
理解类加载顺序和隔离机制,能避免类冲突,保证应用的正常运行。 5. **Tomcat权威指南** "Tomcat权威指南"通常涵盖Tomcat的安装、配置、安全管理、集群、连接池、日志和性能调优等方面。阅读这本书可以系统地学习...
2. **Catalina ClassLoader**加载Tomcat核心类库; 3. **Common ClassLoader**加载Tomcat公共类库; 4. **WebApp ClassLoader**加载Web应用类库; 5. **Connector**和**Container**等组件初始化; 6. **Web应用**...
类和资源的加载顺序遵循以下原则: 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/...
JVM 在加载时,采用的是一种双亲委托机制,当类加载器要加载一个类时,加载顺序是: 首先将请求委托给父加载器,如果父加载器找不到要加载的类然后再查找自己的存储库尝试加载 这个机制的好处就是能够保证核心类库不...
Tomcat7源码还涉及到了类加载机制,它采用了自定义的类加载器,如`CatalinaClassLoader`和`SharedClassLoader`,理解这些类加载器的工作方式有助于解决类冲突和加载顺序问题。 此外,Tomcat的安全管理也是重要一环...
5. ClassLoader机制:理解Classpath的加载顺序和自定义ClassLoader的使用,能有效解决类冲突问题。 四、Tomcat6性能调优 1. 线程池设置:调整最大线程数和最小线程数,避免资源浪费和线程阻塞。 2. JVM内存配置:...