`
theking
  • 浏览: 12595 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

Tomcat classloader的加载顺序

阅读更多

最近项目中遇到在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加载顺序

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

    Tomcat启动时类加载顺序

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

    tomcat 类加载机制 —— ClassLoader

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

    tomcat类加载器

    例如,可以通过修改`common.loader`、`shared.loader`和`context.loader`属性来改变类的加载顺序和来源。 在深入研究"DevLoader"之前,需要查看压缩包内的具体文件,例如org目录下可能包含与DevLoader相关的源代码...

    Tomcat启动顺序

    Bootstrap类加载器完成后,Tomcat会使用系统类加载器(System ClassLoader)加载服务器的全局配置文件,如`server.xml`。这个文件定义了Tomcat的整体架构,包括服务(Service)、连接器(Connector)和引擎(Engine)等组件...

    Tomcat 5.0.18 ClassLoader source code insight

    5. **Parent First / Child First策略**:Tomcat的ClassLoader加载策略有两种,一种是"parent first",另一种是"child first"。默认情况下,Tomcat采用"parent first"策略,即Webapp ClassLoader先尝试让上级Loader...

    Tomcat研究之ClassLoader.pdf

    1. **加载顺序**:在Tomcat中,类的加载遵循特定的顺序。通常情况下,每个子类加载器会先尝试从自己的类路径中加载类,如果找不到,则会向上委托给父类加载器进行加载。这种委托模式确保了类的单一性和安全性。 2. ...

    Tomcat.ClassLoader.rar_Java编程_Java_

    Tomcat的类加载顺序通常遵循以下规则: 1. 尝试从当前Web应用的WEB-INF/classes目录和WEB-INF/lib下的jar文件加载。 2. 如果找不到,会委托给上一级的ClassLoader,通常是Common ClassLoader,加载全局共享的类库。 ...

    细说Tomcat如何打破双亲委派(有源码和图)

    6. **优化的加载顺序**: Tomcat通过自定义加载顺序,使得应用可以覆盖服务器级别的类库,从而实现了更灵活的部署和扩展。 `classloader2.vsd`文件可能是类加载器层次结构的Visio绘图文件,它能直观地展示上述类加载...

    Tomcat通俗讲解

    以下是类加载器的基本层级结构及其加载顺序: - **Bootstrap ClassLoader**:加载Java核心类库,位于`$JAVA_HOME/jre/lib/ext/*.jar`。 - **System ClassLoader**:加载用户自定义的类和类路径中的类库。 - **...

    tomcat 学习与分析总结资料

    理解类加载顺序和隔离机制,能避免类冲突,保证应用的正常运行。 5. **Tomcat权威指南** "Tomcat权威指南"通常涵盖Tomcat的安装、配置、安全管理、集群、连接池、日志和性能调优等方面。阅读这本书可以系统地学习...

    《深入剖析 Tomcat》PDF版本下载.txt

    2. **Catalina ClassLoader**加载Tomcat核心类库; 3. **Common ClassLoader**加载Tomcat公共类库; 4. **WebApp ClassLoader**加载Web应用类库; 5. **Connector**和**Container**等组件初始化; 6. **Web应用**...

    Tomcat 类加载器的实现方法及实例代码

    JVM 在加载时,采用的是一种双亲委托机制,当类加载器要加载一个类时,加载顺序是: 首先将请求委托给父加载器,如果父加载器找不到要加载的类然后再查找自己的存储库尝试加载 这个机制的好处就是能够保证核心类库不...

    Tomcat7 源码Eclipse工程

    Tomcat7源码还涉及到了类加载机制,它采用了自定义的类加载器,如`CatalinaClassLoader`和`SharedClassLoader`,理解这些类加载器的工作方式有助于解决类冲突和加载顺序问题。 此外,Tomcat的安全管理也是重要一环...

    tomcat6工具

    5. ClassLoader机制:理解Classpath的加载顺序和自定义ClassLoader的使用,能有效解决类冲突问题。 四、Tomcat6性能调优 1. 线程池设置:调整最大线程数和最小线程数,避免资源浪费和线程阻塞。 2. JVM内存配置:...

Global site tag (gtag.js) - Google Analytics