• 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>
  • 相关阅读:
    思考:学习redis的数据结构应该从三个维度来学习?
    思考:一个程序员老说不会碰到或者用到复杂的数据结构或者算法,是这样吗?
    思考:软件系统设计的(前期)权衡?
    思考:一个推荐引擎工程师的能力覆盖
    思考:关于服务架构的取舍:
    模拟斗地主真人在线发牌
    java反射机制
    C-练习题
    java-线程的生命周期
    生产者和消费者模型
  • 原文地址:https://www.cnblogs.com/softidea/p/6060594.html
Copyright © 2020-2023  润新知