zoukankan      html  css  js  c++  java
  • tomcat 5.5 动态加载类

    转载于:http://www.itxuexiwang.com/a/javadianzishu/tomcat/2016/0225/161.html?1456480735

    开发使用的是tomcat5.5.27,对于WEB-INF/classes下面的类做了修改,tomcat就会就会自动重启,然后紧接着就是内存溢出。调试比较麻烦。昨天研究了一下tomcat的源代码,对类的加载机制作了一点点修改,让它动态加载类,这样调试的时候如果修改了java文件就不用重启 tomcat了。具体步骤如下:

    修改WebappClassLoader.java文件中的modify()方法,
    在745行的
        return (true);注销,修改为:
        // return (true);
        //做了修改,重新装载
        this.reloadresource(i);
        return false;

    然后添加一个对方法reloadresource的实现:
        /**
         * 重新装载的动作包括:
         * 1。重新装载
         * 2。更新最新时间
         * @param i
         */
        private void reloadresource(int i)throws NamingException{
            String path = paths[i];
            String tclassName = path.replaceAll(this.repositories[0], "");
            String name = tclassName.replaceAll("/", ".").replaceAll(".class", "");
            
            resourceEntries.remove(name);
            this.findResourceInternal(name, tclassName); 
            System.out.println("重新加载了类文件:"+tclassName);
            long lastModified =
                ((ResourceAttributes) resources.getAttributes(path))
                .getLastModified();
            lastModifiedDates[i] = lastModified;
            
            //从这里加载的相当于多在paths和lastModifiedDates中多添加了冗余记录,需要删除最后一个
            synchronized (allPermission) {
                int j;
                long[] result2 = 
                    new long[lastModifiedDates.length - 1];
                for (j = 0; j < (lastModifiedDates.length - 1); j++) {
                    result2[j] = lastModifiedDates[j];
                    }
                lastModifiedDates = result2;

                String[] result = new String[paths.length - 1];
                for (j = 0; j < (paths.length - 1); j++) {
                    result[j] = paths[j];
                    }
                paths = result;

            }
        }
    这样就可以动态的由tomcat来加载类了。

  • 相关阅读:
    JN_0026:FTP连接站点 规避防火墙
    JS_0002:js读取外部json文件
    JQPlug0002:layer Zindex不断增加的问题 弹窗一直置顶
    JQPlug0001:layer父子页面通信,常用打开模版
    Web_0010:Html打包EXE方法
    Web_0009:win系统下注册自己的协议,用于web项目启动本地程序
    ZAB 和 Paxos 算法的联系与区别?
    保证缓存与数据库双写时的数据一致性
    解决 Redis 的并发竞争 Key 问题
    缓存雪崩和缓存穿透
  • 原文地址:https://www.cnblogs.com/itxuexiwang/p/5221220.html
Copyright © 2011-2022 走看看