zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    HTTP的KeepAlive是开启还是关闭?
    JS中关于in运算符的问题
    关于jQuery的inArray 方法介绍
    JS中括号的用法
    关于js中for in的缺陷浅析
    Ajax datatype:'JSON'的error问题Status1:200,JSON格式
    windows 如何查看端口占用情况?
    确认过眼神,看清 HTTP 协议
    高考完?入门级的开源项目带你开启编程之旅
    MongoDB入门系列(四):权限管理
  • 原文地址:https://www.cnblogs.com/softidea/p/6060594.html
Copyright © 2011-2022 走看看