springMVC工程使用jreloader实现热部署

springMVC工程使用jreloader实现热部署
applicationContext - ContextLoaderListener重新加载
DispatcherServlet 重新加载
提高开发效率

1: jreloader 是class的热加载器
(1) 从网上下载jreloaderjar包
(2) 在运行配置中的vm参数中添加
-noverify -javaagent:./jreloader.jar - Djreloader.dirs=./target/classes
Djreloader.dirs 是class的路径,多个路径使用逗号隔开
2:继承org.springframework.web.context.ContextLoaderListener重写contextInitialized的方法

import javax.servlet.ServletContextEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractRefreshableApplicationContext;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class WebContextListener extends ContextLoaderListener {
private static Logger logger = LoggerFactory.getLogger("Init");
public static ApplicationContext applicationContext;
public static ServletContextEvent servletContextEvent;
/**
* 获取spring 初始化的bean
*
* @param name
* @param requiredType
* @return
* @throws Exception
*/
public static T getBean(String name, Class requiredType)
throws Exception {
return applicationContext.getBean(name, requiredType);
}

/**
* 获取属性bean
*
* @param name
* @return
* @throws Exception
*/
public static Object getBean(String name) throws Exception {
return applicationContext.getBean(name);
}

@Override
public void contextInitialized(ServletContextEvent event) {
/** 初始化bean **/
super.contextInitialized(event);
/** 初始化context 和event **/
applicationContext = WebApplicationContextUtils
.getRequiredWebApplicationContext(event.getServletContext());
servletContextEvent = event;
/** 打印SUCCESS图案 **/
logger.info("*******************");
logger.info("**---------------**");
logger.info("**--***********--**");
logger.info("**--*---------*--**");
logger.info("**--*-SUCCESS-*--**");
logger.info("**--*---------*--**");
logger.info("**--***********--**");
logger.info("**---------------**");
logger.info("*******************");
}
/**
* applicationContext的reload
*/
public static void reloadApplicationContext() {
AbstractRefreshableApplicationContext abstractRefreshableApplicationContext = (AbstractRefreshableApplicationContext) applicationContext;
logger.info("start refresh the application context");
abstractRefreshableApplicationContext.refresh();
/** 打印SUCCESS图案 **/
logger.info("*******************");
logger.info("**---------------**");
logger.info("**--***********--**");
logger.info("**--*-REFRESH-*--**");
logger.info("**--*---------*--**");
logger.info("**--*-SUCCESS-*--**");
logger.info("**--***********--**");
logger.info("**---------------**");
logger.info("*******************");
logger.info("reload the application context success");
}
}
3:继承org.springframework.web.servlet.DispatcherServlet,添加refreshes方法,重写init方法
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.DispatcherServlet;

public class MVCServlet extends DispatcherServlet {
private static final long serialVersionUID = 1L;
private static MVCServlet servlet;
private static Logger logger = LoggerFactory.getLogger("Init");
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
servlet = this;
/** 打印SUCCESS图案 **/
logger.info("*******************");
logger.info("**---------------**");
logger.info("**--***********--**");
logger.info("**--*---------*--**");
logger.info("**--*-SUCCESS-*--**");
logger.info("**--*---------*--**");
logger.info("**--***********--**");
logger.info("**---------------**");
logger.info("*******************");
}

public static void refreshes(){
servlet.refresh();
}
}
4:添加重载的Controller
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.ustcinfo.edi.datacfg.web.listener.WebContextListener;
import com.ustcinfo.edi.datacfg.web.servlet.MVCServlet;
@Controller
@RequestMapping("/reload")
public class ReloadController {
@ResponseBody
@RequestMapping("/reloadSpringController")
public String reloadSpringController() {
MVCServlet.refreshes();
return "success";
}

@ResponseBody
@RequestMapping("/reloadSpringContext")
public String reloadSpringContext() {
WebContextListener.reloadApplicationContext();
return "success";
}
}
5: 修改web.xml里面listener和servlet指向的class是上面两个重载的类

通过以上5个步骤,使用jreloader实现JVM中class的热加载,通过继承 org.springframework.web.context.ContextLoaderListener可以细线spring的配置bean的重载,通过继承org.springframework.web.servlet.DispatcherServlet,实现所有的Controller的重载,这样在开发过程中就可以完全实现热部署,不需要频繁的启动。重载的方法就是在浏览器里面输入那两个Controller的路径。

在一些大的工程中,启动一次耗费的代价太大,有的需要几分钟,一天的开发中需要频繁的重启,8个小时有1个小时在等待,通过上面的5个步骤可以实现热部署,一天节省1个小时的等待时间,提高开发的效率是很有必要的。

时间: 2024-10-16 23:12:16

springMVC工程使用jreloader实现热部署的相关文章

maven工程使用spring-boot-devtools进行热部署,更改代码避免重启web容器

spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去.相关Blog: 点击打开链接 原理是在发现代码有更改之后,重新启动应用,但是比速度比手动停止后再启动还要更快,更快指的不是节省出来的手工操作的时间. 其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为  restart ClassLoader ,这样在有代码更

基于tomcat插件的maven多模块工程热部署

内容属原创,转载请注明出处 写在前面的话 最近一直比较纠结,归根结底在于工程的模块化拆分.以前也干过这事,但是一直对以前的结果不满意,这会重操旧业,希望搞出个自己满意的结果. 之前有什么不满意的呢? 1. 基于maven拆分模块后,热部署的效果不好,经常出故障. 2. 对于多个子web工程,不能做到任意一个web工程都可以放到tomcat里运行,要在外面搞个壳子组合多个工程. 于是,有了这纠结的一周,也有了此文. 本文关于什么 如标题所言,本文涉及到如下几个内容: 1. maven多模块工程 2

java学习---maven工程的创建+tomcat的热部署

 一.创建maven工程 1.创建maven的的web功能 2.在创建完成后,可能发现功能有错误,在eclipse中的错误描述如下: The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解决办法如下: 步骤:bulid Path --> Configure Bulid Path --> Libraries --> add Library -->

eclipse 在 Tomcat中 热部署 工程

eclipse在 Tomcat中热部署工程 1.在eclipse中国安装一个tomcat插件:SysdeoEclipse Tomcat Launcher plugin(http://www.eclipsetotale.com/tomcatPlugin.html ) 2.新建一个web工程,比如:hello 3.配置tomcat服务器.打开菜单window->preferences->tomcat 这里context declaration mode 有两种选择,是用来指定应用(Context)

Tomcat热部署,Web工程中线程没有终止

近期项目中,用 jenkins 热部署 web工程时,发现工程中静态持有的线程(将ScheduledExecutorService定时任务存储在静态Map中),导致不定时出现数据库访问事务关闭异常,如下:org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.Il

SpringBoot工程+热部署进行远程调试

本文转载自:https://blog.csdn.net/qq_31868349/article/details/78553901 SpringBoot工程+热部署进行远程调试 本地端添加配置 在pom.xml文件添加配置: <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <config

SpringBoot工程热部署

SpringBoot工程热部署 1.在pom文件中添加热部署依赖 <!-- 热部署配置 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> 2.修改配置 添加依赖后再启动项目我们发现并不起作用.出现这种情况,并不是热部署配置问题,其根本

freemarker热部署(Intellij Idea)

IntelliJ + springmvc + freemarker 开发环境 缓存设置 2015-05-26 13:31 通过阅读源码搞定了 先设置springmvc的缓存控制.这是最高优先级的缓存控制.一旦springmvc发现没有缓存开启,就会进行cache,如果发现缓存没开启,则会每次生成一个view(通过调用freemarker的方法来进行). 再设置freemakre的缓存控制.freemakre通过一个时间长度来控制缓存 在上面两步完成之后,一般来说就可以了.但是还有一个问题是,we

安装IntelliJ IDEA热部署tomcat插件JreBel

最近试着使用IntelliJ IDEA这款IDE,网上说它是最好用的java开发工具~但奈何国内ecilpse市场占有率实在稳固,所以国内这个工具也就少数人在使用 当然使用起来跟ecilpse还是有很大差别的,特别的它新建一个project就是相对ecilpse的一个工作空间,这个到现在我还是不习惯~目测越扯越扯远了-,- 不过最不习惯的还是它用tomcat部署工程的时候,不能实现热部署,不说更改java文件,就是在页面更改一点东西加个标签什么的,都得重启tomcat才能刷新...天啊,这得浪费