Tomcat classloader的加载顺序

本文探讨了在Tomcat7.0.26环境中遇到的类加载顺序不稳定的问题,并深入分析了tomcatlibext与webappWEB-INFlib下jar文件加载差异的原因。文章详细介绍了Common和System Class加载器与Webapp Classloader的不同行为,以及它们如何影响类的加载顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目中遇到在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;
        ......

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值