文档章节

模拟tomcat热部署

一只小桃子
 一只小桃子
发布于 2014/11/10 14:23
字数 620
阅读 64
收藏 1
点赞 0
评论 0

第一步,写一个自定义的classLoader,用这个classLoader去加载应用的类,这样我们才能做到不用的时候,把应用相关的类卸载掉。

public class MyClassLoader extends ClassLoader{

    private String baseDir;
    
    public MyClassLoader(String baseDir){
        this.baseDir = baseDir;
    }
    
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        Class<?> c = this.findLoadedClass(name);
        if(c != null){
            return c;
        }
        byte[] bytes = getBytes(baseDir,name);
        if(bytes == null){
            throw new ClassNotFoundException("没找到class");
        }
        c = super.defineClass(name, bytes, 0, bytes.length);
        return c;
    }
    
    
    
    /**
     * 从指定的目录下,获得class,读成byte数组
     */
    public byte[] getBytes(String baseDir,String className){
  String filePath = baseDir+File.separator+className.replace('.', File.separatorChar)+".class";
        byte[] bytes = null;
        FileInputStream in = null;
        try {
            File file = new File(filePath);
            bytes = new byte[(int)file.length()];
            in = new FileInputStream(file);
            in.read(bytes);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(in !=null){
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return bytes;
    }
    
}


第二步。写一个context类,相当于tomcat里一个项目,context不停的去加载一个类,调用doit方法。context可以启动和停止。

public class Context extends Thread{

    public Context(String baseDir,Container container){
        this.container = container;
        this.baseDir = baseDir;
    }
    
    private String baseDir;
    private volatile  boolean running = true;
    private Container container;
    
    
    public void contextStop(){
        running = false;
    }
    
    public void run(){
        MyClassLoader loader= new MyClassLoader(baseDir);
        Thread.currentThread().setContextClassLoader(loader);
        while(running){
            try {
       Object w = this.getContextClassLoader().loadClass("hutao.hotswap.Worker").newInstance();
                Method m = w.getClass().getDeclaredMethod("doit",new Class<?>[]{});
                m.invoke(w, new Object[]{});
            } catch (InstantiationException e1) {
            } catch (IllegalAccessException e1) {
            } catch (ClassNotFoundException e1) {
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            try{
                Thread.sleep(300l);
            }catch(InterruptedException e){
                System.out.println("被打断了");
            }
        }
        container.newAble = true;
    }
}


第三步,写一个container,相当于tomcat本身,他启动一个context,让context去工作,同时,监控目录下的类文件,看类文件是否有修改,如果有修改,停止当前的context,然后重启一个context.

public class Container {
    public static void main(String[] args){
        Container con = new Container();
        con.start();
    }
    
    public volatile boolean newAble = true;
    private long lastModify = 0l;
    private Context context;
    
    public void start(){
        lastModify = (new File("D:hutao\\hotswap\\Worker.class")).lastModified();
        context = new Context("D:",this);
        context.start();
        
        while(true){
            long now = (new File("D:hutao\\hotswap\\Worker.class")).lastModified();
            if((now != lastModify)){
                lastModify = now;
                context.contextStop();
                //等待环境释放
                while(!newAble){
                    try {
                        Thread.sleep(100l);
                    } catch (InterruptedException e) {
                    }
                }
                //环境释放完,重新部署
                context = new Context("D:",this);
                context.start();
                newAble = false;
            }
            try {
                Thread.sleep(100l);
            } catch (InterruptedException e) {
            }
        }
    }
}


然后我们写一个工作类,编译成class文件,放到D盘下,注意,这个类如果定义了package的话,应该建立和package相同的目录,否则加载类的时候会出错。 然后我们启动container,container会启动一个context, context不停的去调用类的doit方法,但我们重新编译另一个class ,覆盖掉D盘下的class ,container会监控到有class文件有改变,从而重启context, 这样子就做到了热部署。

public class Worker{
    public void doit(){
        System.out.println("this is worker 1");
    }
}


© 著作权归作者所有

共有 人打赏支持
一只小桃子

一只小桃子

粉丝 205
博文 86
码字总数 115906
作品 0
武汉
程序员
Eclipse Maven Tomcat的利用配置

1.事先准备 m2eclipse插件中其实内嵌了Maven,但个人更偏向于用独立的Maven(可以自由选择版本啦,偶尔可以在命令行中跑Maven命令啦)。 下载Apache Maven:http://maven.apache.org/,关于环...

躺着的S ⋅ 2013/08/03 ⋅ 4

Tomcat热部署的实现原理

概述 名词解释:所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。 对于Java应用程序来说,热部署就是在运行时更新Java类文件。在基于Java的应用服务器实现热部署的过程...

不正经啊不正经 ⋅ 2015/01/06 ⋅ 0

Tomcat 热部署实现方式源码分析总结

研究了一下tomcat的类的热部署的源码实现,总结沉淀一下。Tomat实现热部署主要有两种机制: (1) 一种是类似于Servlet这种类的热部署即在WEB-INF/class目录下的类:实现方式可以概括为在容器启...

heroShane ⋅ 2014/02/11 ⋅ 0

关于maven的几个常用插件

最近整理了自己写的一个项目,使用maven+svn管理,idea开发,搭建了一个maven的私服.原来是凌乱不堪,所以费了好大劲才整理好,而且平时公司项目上事情多的一米... 下面说说使用的几个插件(至于那...

Crazy_Coder ⋅ 2013/11/18 ⋅ 0

maven 分模块开发的时候怎么热部署

maven 分模块开发的时候怎么热部署,现在要么就是重启tomcat,要么就是先执行命令mvn clean install后再重启tomcat,可有什么热部署方案来节省时间,提高开发效率...

FelixFly ⋅ 01/18 ⋅ 0

请推荐一个支持tomcat热部署的eclipse插件

谁能提供一个tomcat的热部署插件,要求支持eclipse。 我是用了Sysdeo Tomcat plugin3.3,但是发现一个问题,修改了struts的action,虽然不用重启tomcat,但是,后台还是会把spring和action相...

JustForFly ⋅ 2012/03/17 ⋅ 6

Tomcat热部署的实现原理

Tomcat热部署机制 对于Java应用程序来说,热部署就是在运行时更新Java类文件。在基于Java的应用服务器实现热部署的过程中,。大多数基于Java的应用服务器,包括EJB服务器和Servlet容器,都支...

陶邦仁 ⋅ 2015/01/05 ⋅ 2

maven实现多模块热部署

一、背景 基于maven的项目工程都会按模块划分,每个模块最终形成一个jar包,那么每次对模块的修改就需要重新打包,这样的工作重复而繁琐,以前的热部署解决方案都是只针对web模块的修改,如能...

小咔蹭 ⋅ 2013/09/28 ⋅ 1

Tomcat Maven Plugin

maven-tomcat-plugin让maven与tomcat配合得很好。它可以把应用部署到Tomcat服务器,也可以把 tomcat作为内嵌服务器启动,就像jetty一样。 使用JPDA启动tomcat的远程调试功能。这样就能与ecl...

匿名 ⋅ 2011/09/07 ⋅ 0

使用Maven如何debug和热部署

最近尝试将项目用Maven管理,Maven管理能力确实不错,但在开发时,却遇到了一些问题,望大家指点: 1、debug问题: 我是使用Maven的tomcat插件:tomcat-maven-plugin在eclipse里直接集成tom...

nick_chen ⋅ 2013/01/21 ⋅ 10

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 32分钟前 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

vim编辑模式、vim命令模式、vim实践

vim编辑模式 编辑模式用来输入或修改文本内容,编辑模式除了Esc外其他键几乎都是输入 如何进入编辑模式 一般模式输入以下按键,均可进入编辑模式,左下角提示 insert(中文为插入) 字样 i ...

蛋黄Yolks ⋅ 昨天 ⋅ 0

大数据入门基础:SSH介绍

什么是ssh 简单说,SSH是一种网络协议,用于计算机之间的加密登录。 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码...

董黎明 ⋅ 昨天 ⋅ 0

web3j教程

web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 汇智网最新发布的web3j教程,详细讲解...

汇智网教程 ⋅ 昨天 ⋅ 0

谷歌:安全问题机制并不如你想象中安全

腾讯科技讯 5月25日,如今的你或许已经对许多网站所使用的“安全问题机制”习以为常了,但你真的认为包括“你第一个宠物的名字是什么?”这些问题能够保障你的帐户安全吗? 根据谷歌(微博)安...

问题终结者 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部