Spring Loaded is a JVM agent for reloading class file changes

 

            <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()能够实现类的热替换,但遗憾的是功能很有限。

?


1

2

3

4

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的情况下,是否能够动态改变。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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的时候,增加如下的启动参数即可

?


1

-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

?


1

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的配置文件的修改不能即时生效。

http://blog.csdn.net/catoop/article/details/51034778

 

 

 

<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>
时间: 2024-12-23 17:53:33

Spring Loaded is a JVM agent for reloading class file changes的相关文章

使用Ratpack与Spring Boot构建高性能JVM微服务

在微服务天堂中Ratpack和Spring Boot是天造地设的一对.它们都是以开发者为中心的运行于JVM之上的web框架,侧重于生产率.效率以及轻量级部署.他们在服务程序的开发中带来了各自的好处.Ratpack通过一个高吞吐量.非阻塞式的web层提供了一个反应式编程模型,而且对应用程序结构的定义和HTTP请求过程提供了一个便利的处理程序链:Spring Boot集成了整个Spring生态系统,为应用程序提供了一种简单的方式来配置和启用组件.Ratpack和Spring Boot是构建原生支持计

在iReport中如何配置spring loaded Hibernate connection

问题描述 测试连接时报以下错误:errorparsingbeanwithname'LoginAction'definedinclasspathresoure[applicationContext.xml]:Classthatbeanclass[com.test.zzz.action.LoginAction]dependsonnotfound;nestedexceptionisjava.lang.NoClassDefFoundError:org/apache/struts2/interceptor

spring mvc-SpringMVC 后台怎么获取前台jsp页面中file中的文件。

问题描述 SpringMVC 后台怎么获取前台jsp页面中file中的文件. 把file中的Excel文件提交,后台该如何获取这个Excel文件. 解决方案 SpringMVC默认是关闭fileupload功能的,开启该能够并验证文件上传,需要做如下几件事情: 第一:打开SpringMVC的文件上传功能: ***-servlet.xml中配置: <bean id="multipartResolver" class="org.springframework.web.mul

翻译-使用Ratpack和Spring Boot打造高性能的JVM微服务应用

这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices with Ratpack & Spring Boot,InfoQ上的中文地址:使用Ratpack与Spring Boot构建高性能JVM微服务. 在微服务天堂中Ratpack和Spring Boot是天造地设的一对.它们都是以开发者为中心的运行于JVM之上的web框架,侧重于生产率.效率以及轻量级部署.他们在服务程序的开发中带来了各自的好处.Ratpack通过一个高吞吐量.非

DevTools in Spring Boot

本文主要了解Spring Boot 1.3.0新添加的spring-boot-devtools模块的使用,该模块主要是为了提高开发者开发Spring Boot应用的用户体验. 要想使用该模块需要在Maven中添加: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifact

模式实践:观察者模式与Spring

公司的项目告一段落,最近在进行RUP培训项目,有了些空闲的时间.闲暇浏览TheServerSide时,看到一篇名叫<Spring loaded Observer Pattern>的文章,不禁会心一笑--我已在两个月前应用到项目中了.而作者的观点也和我的观点吻合:the Spring framework is a great reason to continue design pattern advocacy in your projects. 下面我将自己在项目中应用的实例拿出来和大家分享,共

Spring Boot特性

1. SpringApplication SpringApplication 类是启动 Spring Boot 应用的入口类,你可以创建一个包含 main() 方法的类,来运行 SpringApplication.run 这个静态方法: public static void main(String[] args) { SpringApplication.run(MySpringConfiguration.class, args); } 运行该类会有如下输出: . ____ _ __ _ _ /\

有关JVM加载类的问题

问题描述 由于一般的项目中,JVM直接加载了所有的类到内存中,而Spring使用的是晚加载,那么spring是如何限制JVM进行晚加载AppClassLoader的呢 解决方案 引用由于一般的项目中,JVM直接加载了所有的类到内存中,这句话,本身就是不对的,请依次执行下面的t1和t2.你会发现,只执行t1的时候,B是不会被加载进来的.换句话,只有到真正需要B,才加载B这个类.下面的代码没用到ArrayList,难道ArrayList一开始就被加载了?愿意的话,你自己写个ClassLoader验证

《Spring Boot官方指南》翻译邀请

学技术并发网始终建议同学们阅读原版官方文档,所以并发网每月都会组织大家翻译各种官方技术文档.9月份并发网组织大家翻译<Spring Boot官方指南>,欢迎有兴趣的同学参与. 如何领取  通过评论领取想要翻译的文章,每次领取一章,如Spring Boot Documentation,翻译完后再领取其他章节.领取完成之后,建议在一个星期内翻译完成,如果不能完成翻译,也欢迎你邀请其他同学和你一起完成翻译. 如何提交? 翻译完成之后请登录到并发网提交成待审核状态,会有专门的编辑校对后进行发布.校对完