@月黑风高食肉虎 噗噗虎的技术博客

Spring devtools 学习笔记


Spring devtools 使用方法:

Maven:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

Gradle:

dependencies {
    compile("org.springframework.boot:spring-boot-devtools")
}

注意,如果app是以打包完的形式运行的,devtools会自动失效。如果以java -jar的方式启动,Spring会认为它是运行在生产环境,所以devtools会自动失效。

devtools 自动包含的properties:

查看DevToolsPropertyDefaultsPostProcessor

devtools 自动重启

使用方式

  • 在Eclipse中保存更改的java文件便会自动重启。
  • 在IDEA中需要build -> make project
  • 在mvn spring-boot:run中,需要设置fork(仅maven, gradle不用)
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
</build>

额外配置

devtools自动重启是通过监视整个classpath实现的,通过设置spring.devtools.restart.exclude或者spring.devtools.restart.additional-exclude屏蔽监视的文件。或者设置spring.devtools.restart.additional-paths增加监视的路径。

设置spring.devtools.restart.enabled=false停用自动重启。

设置spring.devtools.restart.trigger-file指定触发文件,通过修改触发文件自动重启。

实现方式

devtools通过将不变的class(jar包里的)加载到baseClassloader,将会变化的class(classpath下的)加载到childClassloader,重启的时候baseClassloader不动,通过抛弃并重新加载childClassloader实现热重启。

通过配置META-INF/spring-devtools.properties中的restart.exclude.xxxrestart.include.xxx可以更改加载到哪个classloader

浏览器自动刷新

从livereload.com安装插件即可。设置spring.devtools.livereload.enabled=false禁用。

全局设定

devtools可以有全局设定, 配置~/.spring-boot-devtools.properties文件即可。

远程调试

  • 远端和本地配置spring.devtools.remote.secret=xxx
  • 本地端运行org.springframework.boot.devtools.RemoteSpringApplication,并指定远端url即可。
  • 本地如果有更新class文件,会自动推送到远端。
  • 如果远端是以debug模式启动的app(-Xdebug -Xrunjdwp:server=y,transport=dt_socket,suspend=n),可以在本地端调试远程端app。默认调试端口为8000,可以通过spring.devtools.remtoe.debug.local-port更改。