idea热加载,小锤子
当下互联网公司,业务开发会用到微服务,将整个业务按照某个方向拆分成多个项目系统,也就是会维护多个系统,那么当我们在开发某个业务项目的时候,可能会涉及到多个系统,这在互联网行业是比较常见的,而开发项目的工具我们可能用到IDEA,或者其他的,我们以当前比较流行的开发工具IDEA为例,说明如何在当前窗口导入多个项目,避免多个项目多个窗口来回切换。3、显示文件目录,我们选择自己项目的文件,如上图的层级即可
目录
一、首先解决 热部署 和 热加载的区别
热部署:就是容器状态在运行的情况下部署或者重新部署整个项目.在这种情况下一般整个内存会清空,重新加载.简单来说就是Tomcat或者其他的web服务器会帮我们重新加载项目.这种方式可能会造成sessin丢失等情况.
热加载:就是容器状态在运行的情况下重新加载改变编译后的类.在这种情况下内存不会清空,sessin不会丢失,但容易造成内存溢出,或者找不到方法。因为内存无法转变成对像. 一般改变类的结构和模型就会有异常,在已经有的变量和方法中改变是不会出问题的。在中模式最好是在调试过程中使用,免得整个项目加载.
二、IDEA + Spring Boot 的2种热加载方案
参考: https://blog.51cto.com/u_15310381/3200103
1.spring-boot-devtools
在项目中,我们需要在 pom.xml 中,引入 spring-boot-devtools 依赖如下:
-
<dependency
>
-
<groupId
>org.springframework.boot
<
/groupId
>
-
<artifactId
>spring-boot-devtools
<
/artifactId
>
-
<
optional
>
true
<
/
optional
>
<!-- 可选 --
>
-
<
/dependency
>
下面,我们来演示下 spring-boot-devtools 的使用。
① Run 或者 Debug 运行 Spring Boot 应用。
使用浏览器,访问 http://127.0.0.1:8080/demo/echo 接口,返回结果为 "echo"。
② 修改 DemoController 的 #echo() 方法,设置返回值为 "none"。
【关键】 我们现在仅仅需要修改了 Java 代码,需要重新编译下代码。点击 IDEA 的菜单 Build -> Build Project,手动进行编译。如下图所示:“
友情提示:如果胖友嫌弃鼠标操作太慢,可以使用 Build Project 的快捷键:
Mac:Command + F9
Windows:Ctrl + F9
此时,IDEA 控制台会看到 Spring Boot 重新启动的日志如下:
-
2020-
02-
09
09:
22:
52.082
INFO
36495
--- [ Thread-10] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
-
-
. ____ _ __ _ _
-
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
-
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
-
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
-
' |____| .__|_| |_|_| |_\__, | / / / /
-
=========|_|==============|___/=/_/_/_/
-
::
Spring
Boot :: (v2.
2.4.
RELEASE)
-
-
2020-
02-
09
09:
22:
52.195
INFO
36495
--- [ restartedMain] cn.iocoder.demo03.Demo03Application : Starting Demo03Application on MacBook-Pro-8 with PID 36495 (/Users/yunai/Downloads/demo03/target/classes started by yunai in /Users/yunai/Downloads/demo03)
-
2020-
02-
09
09:
22:
52.195
INFO
36495
--- [ restartedMain] cn.iocoder.demo03.Demo03Application : No active profile set, falling back to default profiles: default
-
2020-
02-
09
09:
22:
52.335
INFO
36495
--- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
-
2020-
02-
09
09:
22:
52.336
INFO
36495
--- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat]
-
2020-
02-
09
09:
22:
52.336
INFO
36495
--- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.30]
-
2020-
02-
09
09:
22:
52.342
INFO
36495
--- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
-
2020-
02-
09
09:
22:
52.342
INFO
36495
--- [ restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 145 ms
-
2020-
02-
09
09:
22:
52.382
INFO
36495
--- [ restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
-
2020-
02-
09
09:
22:
52.409
INFO
36495
--- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
-
2020-
02-
09
09:
22:
52.418
INFO
36495
--- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
-
2020-
02-
09
09:
22:
52.419
INFO
36495
--- [ restartedMain] cn.iocoder.demo03.Demo03Application : Started Demo03Application in 0.244 seconds (JVM running for 169.162)
-
2020-
02-
09
09:
22:
52.420
INFO
36495
--- [ restartedMain] .ConditionEvaluationDeltaLoggingListener : Condition evaluation unchanged
所以 spring-boot-devtools 真的不是热部署,而是更快的重启方式。
使用浏览器,再次访问 http://127.0.0.1:8080/demo/echo 接口,返回结果为 "none",成功!
“
咳咳咳,下面我们来讲解下自动编译。艿艿自己尝试了,亲测失败。例如说 《IDEA 配置 Spring Boot 热更新,无需手动按 ctrl+F9》 文章。看了下评论,貌似其它人也存在失败的情况。
反正这里也写下步骤,胖友可以自己尝试一波~万一成功了,请一定留言,我好找找具体原因。
③ 可能有胖友会觉得手动 Build Project 有点麻烦,IDEA 还提供的自动编译的选项。设置方式,点击 IDEA 的菜单 IntelliJ IDEA -> Preference...,然后选择 Compiler 选项卡,将 Build project automatically 勾选上。如下图所示:
“
友情提示:注意,Build project automatically 后面的一行提示,自动编译仅在项目不处于运行,或者处于 Debug 运行中时,才会自动生效。
所以一定要 Debug 运行 Spring Boot 项目。具体的效果,胖友自己重复 ① ② 两个步骤,自己尝试下。
另外,网上我们会看到教程,建议将 compiler.automake.allow.when.app.running 勾选上。
原因是,自动编译在 Running 运行中默认是不生效的,通过勾选上 compiler.automake.allow.when.app.running,允许在 Running 运行中也生效。
个人建议的话,不要勾选。如果 Running 运行中修改了代码,也会导致热部署,不太合适。如果真要热部署,使用 Debug 运行项目更合理。
2.IDEA 热加载-推荐
IDEA 提供了 HotSwap 插件,可以实现真正的热加载。如下图所示:
3.1 演示
下面,我们来演示下 HotSwap 插件的使用。
① Run 或者 Debug 运行 Spring Boot 应用。
使用浏览器,访问 http://127.0.0.1:8080/demo/echo 接口,返回结果为 "echo"。
② 修改 DemoController 的 #echo() 方法,设置返回值为 "none"。
【关键】 我们现在仅仅需要修改了 Java 代码,需要重新编译下代码。点击 IDEA 的菜单 Build -> Build Project,手动进行编译。如下图所示:
“
友情提示:如果胖友嫌弃鼠标操作太慢,可以使用 Build Project 的快捷键:
Mac:Command + F9
Windows:Ctrl + F9
此时,我们在 IDEA 中可以看修改的类被重载的提示。如下图所示:
使用浏览器,再次访问 http://127.0.0.1:8080/demo/echo 接口,返回结果为 "none",成功!
③ 尝试将 Build project automatically 勾选上,希望实现自动编译,再搭配上 HotSwap 插件的热部署,岂不是更香?!
结果失败,和「2.1 演示」出现一样的问题,略微蛋疼。
这里我们来换一种方式,也能实现自动编译。操作步骤如下图:
要注意,需要焦点从 IDEA 离开。例如说,在我们修改完接口的代码之后,可能会切换到浏览器或者 Postman 对该接口进行测试,此时 IDEA 就会自动更新代码和资源,进行热部署。
现在,我们来 修改 DemoController 的 #echo() 方法,设置返回值为 "todo"。
切换到浏览器再赶紧切换到 IDEA 中,以达到 IDEA 失去焦点的效果。我们在 IDEA 中可以看修改的类被重载的提示。如下图所示:
使用浏览器,再次访问 http://127.0.0.1:8080/demo/echo 接口,返回结果为 "todo",成功!
更多推荐
所有评论(0)