首页 > 其他分享 >Spring Loaded is a JVM agent for reloading class file changes

Spring Loaded is a JVM agent for reloading class file changes

时间:2022-12-20 10:06:05浏览次数:62  
标签:springloaded file 1.2 Spring agent JVM spring RELEASE loaded

 

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>
</dependencies>
</plugin>

 

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 is usable on any bytecode that may run on a JVM, and is actually the reloading system used in Grails 2.

​https://github.com/spring-projects/spring-loaded​

经过自己的尝试,发现使用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中进行设置 

Spring Loaded is a JVM agent for reloading class file changes_JVM

 

接下来我们看下如何在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的情况下,实现应用的热部署。 

​http://www.2cto.com/kf/201411/348927.html​

当然,它也有一些小缺限: 
1. 目前官方提供的1.2.4 版本在linux上可以很好的运行,但在windows还存在bug,官网已经有人提出:​​​https://github.com/spring-projects/spring-loaded/issues/145​​​ 
2. 对于一些第三方框架的注解的修改,不能自动加载,比如:spring mvc的@RequestMapping 
3. log4j的配置文件的修改不能即时生效。


<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>
</dependencies>
</plugin>



标签:springloaded,file,1.2,Spring,agent,JVM,spring,RELEASE,loaded
From: https://blog.51cto.com/u_15147537/5954144

相关文章

  • spring boot 调试 - 热部署
    在bash脚本中的启动方式:#!/bin/bashJAVA_OPTS="-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"nohupjava-jar$JAVA_OPTSscheduler-0.0.1.......
  • 【问题记录】Caused by: java.lang.ClassNotFoundException: org.springframework.boo
    1 报错现象2022-12-2008:53:48:371[restartedMain]INFOorg.springframework.boot.devtools.env.DevToolsPropertyDefaultsPostProcessor.logTo(DevToolsPropertyD......
  • 如何基于 Spring Boot 快速开发一个 Dubbo 微服务应用
    Dubbo还提供了包括XML、API等多种启动与接入方式,更多开发方式和配置细节可参见配置手册。下载示例代码完整示例代码在dubbo-samples中。下载源码gitclone-bm......
  • 【sping框架】 springboot框架中如何整合mybatis框架?
    1.引入依赖spring-boot-stater-webmysql相关mysql驱动druid数据源mybatis相关的(mybatis-spring-boot-stater)依赖(mybatismybatis-spring)2.书写配置 a.开启......
  • SpringMVC传递json字符串,后台接口通过变量接收
    前景介绍在我们日常开发过程中,前台向后台传递参数一般是json或者form表单方式,并且最好统一一种传输方式,不建议json+form混合使用,但是由于form表单在数组结构下拼接比较......
  • Spring 5 中文解析之核心篇-IoC容器(上)
    概述​​Spring​​​使得开发人员更加容易的创建企业级应用程序,它提供了在企业Java生态技术栈中的任何技术体系,同时也提供了​​Groovy​​​和​​Kotlin​​​对JVM的支......
  • 3种 Springboot 全局时间格式化方式,别再写重复代码了
    “本文收录在个人博客:www.chengxy-nds.top,技术资料共享,同进步”时间格式化在项目中使用频率是非常高的,当我们的API接口返回结果,需要对其中某一个date字段属性进行......
  • Spring Security 动态url权限控制
    一、前言本篇文章将讲述SpringSecurity动态分配url权限,未登录权限控制,登录过后根据登录用户角色授予访问url权限基本环境 spring-boot2.1.8mybatis-plus2.2.0......
  • 狂神说 spring mvc 完整版
    springmvc1、回顾MVC1.1、什么是MVCMVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC主......
  • Spring Boot 入门
    ​​spring​​ Boot是Spring社区较新的一个项目。该项目的目的是帮助开发者更容易的创建基于Spring的应用程序和服务,让更多人的人更快的对Spring进行入门体验,让​​Java​......