这篇文章主要介绍“怎么部署Spring-Boot-Devtools”,在日常操作中,相信很多人在怎么部署Spring-Boot-Devtools问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么部署Spring-Boot-Devtools”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
spring-boot-devtools
SpringBoot,StringBuilder,StringBuffer,俗称Java界的3个SB。尤其是SpringBoot,非常的好用,主要归功于它的autoconfig,靠约定来规范开发。
但问题是,SpringBoot加载的Jar包太多、太大了,每次启动都要花费很长时间。对于SpringBoot服务来说,spring-boot-devtools就像一阵及时雨,滋润着瞪眼发呆盯着重启屏幕的同学。
虽然这个东西已经出来很长时间了,但我发现在现实项目中,大家用到的还是比较少。但它的使用非常简单。
只需要在项目的pom文件中,加入下面的jar包即可获取秒级的服务重载(热部署)。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency>
由于starter文件中默认的值就是true,所以下面yml中的配置,并不是必须的。
spring: devtools: restart: enabled: true
我们来验证一下。来的很快。
新建一个简单的controller,输出halloworld。
@Controller public class DemoController { @GetMapping("/test") @ResponseBody public String test(){ return "halloworld"; } }
修改代码,把hallo改成hello。控制台中将开始滚动输出日志,加载项目代码。此时访问浏览器,发现我们的改动生效了。
# 日志显示 Started MbyeApplication in 1.731 seconds (JVM running for 51.115)
控制台也输出了本次restart的时间,只花了不到2秒钟,可以说是飞快了。
为了在代码修改后,能够实时的触发编译,你需要在IDEA中做如下配置。如果这个配置不生效,就需要手动点击一下Build了(注意不是rebuild)。
为什么热部署的重新加载能够这么快呢?因为它的重新启动并不是完整的重启整个应用,而是只重启我们的应用代码。
通过配置META-INF/spring-devtools.properties文件,可以指定每次重新启动都加载第三方jar包。不过这种场景比较少。当然,有include,旧有exclude,示例如下。
restart.exclude.somejar=/somejar-[\\w-]+\.jar restart.include.ajar=/ajar-[\\w-]+\.jar
注意到一件有意思的事情。当我们使用IDEA启动的时候,控制台的输出是这样的。
2020-09-18 21:33:59.495 INFO 4635 --- [ restartedMain] c.g.javarunfast.mbye.MbyeApplication : Starting MbyeApplication on LYCYs-MacBook-Pro.local with PID 4635 (/target/classes started by xjjdog in /Users/xjjdog/codes/javarunfast/mbye) 2020-09-18 21:33:59.495 INFO 4635 --- [ restartedMain] c.g.javarunfast.mbye.MbyeApplication : No active profile set, falling back to default profiles: default 2020-09-18 21:34:00.355 INFO 4635 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! 2020-09-18 21:34:00.355 INFO 4635 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Elasticsearch repositories in DEFAULT mode. 2020-09-18 21:34:00.357 INFO 4635 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 1ms. Found 0 Elasticsearch repository interfaces. 2020-09-18 21:34:00.362 INFO 4635 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! 2020-09-18 21:34:00.362 INFO 4635 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Reactive Elasticsearch repositories in DEFAULT mode.
里面的启动线程是restartedMain。但当我们使用java -jar *jar来启动的时候,主进程并不是restartedMain,而是main。
这是因为,线上环境开启devtools,是没有意义的。
这句话暂时这么说,因为会打脸。
更多功能
要想了解devtools有什么功能,我们先来看一下它的源码目录结构。
filewatch和classpath就不必说了,通过监听文件的变化,即可实现热启动。它原理上是使用一个独立的ClassLoader(具体是指RestartClassLoader),来完成加载后的替换。
学习一下这部分的代码,可以对Java的类加载器有更好的理解。
LiveReload
接下来就是livereload功能。
LiveReload在做前端开发的时候,经常会用到。
devtools也会在后台开启一个LiveReload Server,浏览器会与这个Server保持着一个长连接,当后端有前端资源变动的时候,将会通知浏览器进行刷新,实现热部署。
下面是Chrome的Remote Live Reload插件地址。安装即可拥有这个酷炫的功能。
https://chrome.google.com/webstore/detail/remotelivereload/jlppknnillhjgiengoigajegdpieppei?hl=en-GB
远程部署
这个就有意思多了。我们上面说到,线上环境开启devtools,是没有意义的,现在来打脸。
你可能自己的机器性能比较低,让代码运行在远端,本地只管代码开发。这时候,就可以使用远程热部署。
要开启这个功能,需要做的步骤有点多。
步骤一。
需要在pom.xml中对spring-boot-maven-plugin做如下的更改。
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludeDevtools>false</excludeDevtools> </configuration> </plugin>
步骤二。
在yml中设置一个服务端与调试端连接的密钥。
spring: devtools: remote: secret: test
步骤三。
将SB服务打包成jar,然后启动。
mvn -Dmaven.test.skip=true -Pdev package java -jar -Xdebug \ -Xrunjdwp:server=y,transport=dt_socket,suspend=n \ mbye-0.0.1-SNAPSHOT.jar
可以看到我们在启动的时候加入了很多参数,这就是开启远程被调戏的意思。
步骤四。
在本地IDEA中编辑一个Java文件,并在启动变量里塞进我们的服务端地址(和应用地址一样)。
import org.springframework.boot.devtools.RemoteSpringApplication; public class Remote { public static void main(String[] args) { RemoteSpringApplication.main(new String[]{"http://localhost:8080"}); } }
步骤五。
进行验证。随便编辑一个能看到效果的文件,然后点击build。
下面是IDEA开发端的截图。
下面是服务端截图。可以看到服务已经重新载入了,不过速度特别快。
Listening for remote restart updates on /.~~spring-boot!~/restart Started MbyeApplication in 1.961 seconds (JVM running for 249.452)
访问web页面,发现代码已经上传成功了。
其实,spring-boot-devtools,还不算是最强大的。因为它每次都会使用ClassLoader重新载入项目的class文件。如果你的项目文件特别多,那也是比较慢的。
到此,关于“怎么部署Spring-Boot-Devtools”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!