JDK1.5之后提供了java.lang.instrument.Instrumentation,即java agent机制可以实现类的redefinition和retransform。

redefinition相应Instrumentation.redefineClasses()可以实现类的热替换。但遗憾的是功能非常有限。

The redefinition may change method bodies, the constant pool and attributes.
The redefinition must not add, remove or rename fields or methods, change the
signatures of methods, or change inheritance. These restrictions maybe be
lifted in future versions.

近期遇到一个开源项目spring-loaded,看了下官方的介绍文档:发现它功能比JDK自带的强大多了。

 Spring Loaded is a JVM agent for reloading class file changes whilst a JVM is running.
It transforms classes at loadtime to make them amenable to later reloading.
Unlike 'hot code replace' which only allows simple changes once a JVM is running
(e.g. changes to method bodies), Spring Loaded allows you to
add/modify/delete methods/fields/constructors.
The annotations on types/methods/fields/constructors
can also be modified and it is possible to add/remove/change values in enum types.

经过自己的尝试,发现使用spring-loaded项目。确实能够实现java应用的热部署。以下介绍下怎样将spring-loaded引入到项目中。

我们能够执行以下的这段代码,然后改动A.say()方法,看看在不重新启动JVM的情况下,能否够动态改变。

package test;

import demo.A;

public class TestPreMain
{ // -javaagent:springloaded-1.2.0.RELEASE.jar -noverify
public static void main(String[] args) throws Exception
{ A a = new A(); while (true)
{
a.say();
Thread.sleep(3000);
}
}
}

为了使用spring-loaded实现热部署。我们仅仅须要在启动JVM的时候。添加例如以下的启动參数就可以
-javaagent:springloaded-1.2.0.RELEASE.jar -noverify

假设是通过eclipse启动,那么能够在run confiuration中进行设置


接下来我们看下怎样在tomcat中使用spring-loaded实现war包的热部署。将下载的springloaded-1.2.0.RELEASE.jar放到%TOMCAT_HOME%/bin/文件夹下,然后改动该文件夹下的catalina.bat
set JAVA_OPTS=-javaagent:springloaded-1.2.0.RELEASE.jar -noverify

这样就完毕了spring-loaded的安装,可以检測tomcat下部署的webapp,在不重新启动tomcat的情况下。实现应用的热部署。




使用spring-loaded开源项目,实现java程序和web应用的热部署的更多相关文章

  1. 有哪些值得学习的spring boot开源项目?

    1. awesome-spring-boot 首先给大家介绍的就是Spring Boot 中文索引,这是一个专门收集 Spring Boot 相关资料的开源项目,也有对应的导航页面. 产品主页 htt ...

  2. 优秀的Spring Cloud开源项目整理推荐

    无论是对于初学者,还是有一定工作经验的程序员来讲,Spring Cloud开源项目都是一笔宝贵的财富.下面给大家整理了十个优秀的开源项目,分别是spring-cloud-examples.spaasc ...

  3. IDEA maven 多项目 出现 java 程序包找不到

    使用idea 多项目引入的时候,出现报错信息:Error java程序包找不到 解决办法: 我在引入多个项目的时候,他们是在一个目录里面的.我把整个目录引入了进去.结果报依赖包找不到. 把引入的全部项 ...

  4. Spring Boot 项目在 IntelliJ IDEA 中配置 DevTools 实现热部署(macOS 系统)

    要配置的内容: 1.Preference -> Build, Execution, Deployment -> Complier -> Build project automatic ...

  5. IDEA项目搭建五——使用JRebel插件实现IDEA热部署

    使用IDEA开发时修改了html或js或java代码都需要编译启动浪费了很多时间,所以可以借助热部署插件实现自动编码,每次修改完代码保存后就可以刷新页面看效果很方便,热部署工具有很多在此只推荐JReb ...

  6. Java使用自定义类加载器实现热部署

    热部署: 热部署就是在不重启应用的情况下,当类的定义即字节码文件修改后,能够替换该Class创建的对象.一般情况下,类的加载都是由系统自带的类加载器完成,且对于同一个全限定名的java类,只能被加载一 ...

  7. 基于Java+Spring Boot开源项目JeeSite的Jenkins持续交互介绍

    一.实战项目介绍- JeeSite 基于Spring Boot 2.0 数据存储MySQL 语言:Java 规模大小:适中,适合初学者 源码地址:https://gitee.com/thinkgem/ ...

  8. idea 启动java项目报 java: 程序包org.apache.jasper.tagplugins.jstl.core不存在

    File -- Project Structure

  9. idea启动java Maven项目,出现" java: 程序包xxxx不存在"

    解决办法如下:将idea的构建和运行托管到maven下面

随机推荐

  1. java爬虫的selenium基础使用

    实用博客  selenium java教程 具体项目运用 项目背景:从西安市人民政府网站上获取到县区新闻,从下图可以看出“区县热点”是需要在页面中进行点击的,这里页面使用的是javascript的函数 ...

  2. 微信小程序优化

    setData setData 是小程序开发中使用最频繁的接口,也是最容易引发性能问题的接口.在介绍常见的错误用法前,先简单介绍一下 setData 背后的工作原理. 工作原理 小程序的视图层目前使用 ...

  3. luogu P3765 总统选举(线段树维护摩尔投票+平衡树)

    这题需要一个黑科技--摩尔投票.这是一个什么东西?一个神奇的方法求一个序列中出现次数大于长度一半的数. 简而言之就是同加异减: 比如有一个代表投票结果的序列. \[[1,2,1,1,2,1,1]\] ...

  4. 【Computer Vision】角点检测和匹配——Harris算子

    一.基本概念 角点corner:可以将角点看做两个边缘的交叉处,在两个方向上都有较大的变化.具体可由下图中分辨出来: 兴趣点interest point:兴趣点是图像中能够较鲁棒的检测出来的点,它不仅 ...

  5. 如何绑定host

    绑定host一般分为windows和linux下两种情况. windows下,首先打开host文件,其操作步骤 ,打开 C:\Windows\System32\Drivers\etc\hosts的文件 ...

  6. vue中的methods、computed和watch

    1.computed属性: 经过处理返回的数据值,只要源数据没有发生改变,computed函数里面对相应的数据就不会反生改变,相当于缓存在本地;发生改变的时候,computed对应数据的函数才会发生改 ...

  7. 配置oh-my-zsh

    1. 当使用zsh进入庞大的git工程目录下时,会发生cd命令很慢的情况 可以把~/.oh-my-zsh/lib/git.zsh里面的git_prompt_info函数替换为 function git ...

  8. 使用IR2101半桥驱动电机的案例

    作为一个电机驱动开发方面的菜鸟,近日研究了一下通过MOS管对整流后的电源斩波用以驱动直流电机进行调速的方案. 在驱动的过程中,遇到了很多问题,当然也有很多的收获. 写下来以供自己将来查阅,也为其他菜鸟 ...

  9. js模拟支付宝提交表单

    弄过支付宝的程序猿可能都知道,里面有非常多地方都用到了自提交表单的方式,支付宝的接口通过请求API的形式取得server返回的表单字符串,使用out.print("表单字符串")在 ...

  10. Java之旅(二)--- ServletContext

     什么是ServletContext?  WEB容器在启动时,它会为每一个WEB应用程序都创建一个相应的ServletContext对象.它代表当前web应用.通过使用这个对象,servlet能够 ...