Tomcat 热部署的实现原理详解

2019-10-18 15:37:19于海丽

以上是基本实现代码,需要组件为:

1.HotAgent(预加载)

 2.ClassTransform(在加载class的时候可以修改class的字节码),本例中没用到

3.ReloadTask(class定时加载器,以上代码仅供参考)

4.META-INF/MANIFEST.MF内容为:(参数一:支持class重定义;参数二:预加载类)

Can-Redefine-Classes: true Premain-Class: agent.HotAgent

5.将以上组件打包成jar文件(到此,组件已经完成,下面为编写测试类文件)。

6.新建一个java工程,编写一个java逻辑类,并编写一个Test类,在该测试类中调用逻辑类的方法,

下面看下测试类代码:

package test.redefine;
 
public class Bean1 {
  public void test1(){
   System.out.println("============================");
  }
}

package test.redefine;
 
public class Test {
  public static void main(String[] args)throws InterruptedException {
 
    Bean1 c1=new Bean1();
    while(true){
      c1.test1();
      Thread.sleep(5000);
    }
  }
}

运行测试类:

java –javaagent:agent.jar test.redefine.Test

在测试类中,我们使用了一个死循环,定时调用逻辑类的方法。我们可以修改Bean1中的方法实现,将在不同时间看到不同的输出结果,关于技术细节也没什么好讲的了,相信大家都能明白。

Tomcat 热部署配置

<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false"> 
  <Context docBase="CPCWeb" path="/CPCWeb" reloadable="true" source="org.<span class="wp_keywordlink"><a href="http://res.importnew.com/eclipse" title="Eclipse ImportNew主页" target="_blank">Eclipse</a></span>.jst.j2ee.server:CPCWeb"/>
</Host>

autoDeploy=”true” — 自动部署 reloadable=”true” — 自动加载

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!