热部署不会用在生产环境,但对于程序员开发的效率,还是有一定帮助的,所谓的热部署,就是在应用程序在不停止的情况下,实现新的部署。我们在刚开始学习SSM框架的时候,自己手动配置Tomcat,也是可以直接进行热加载设置的,那么在SpringBoot中应该如何设置呢?
首先我们需要添加一个依赖,如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
spring-boot-devtools 是一个为开发者服务的一个模块,其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(如第三方Jar包),另一个ClassLoader加载会更改的类,称为 restart ClassLoader,
这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
这里需要注意的是,如果我们在项目中集成了Thymeleaf模板或FreeMarker模板,那么则需要在配置文件中进行相关的设置
spring.thymeleaf.cache=false
spring.freemarker.cache=false
至此,如果我们使用的是Eclipse的话,那么就已经OK了,但是如果使用的是IDEA的话,那么我们还需要进行一些相关的设置,因为IDEA是没有保存修改的,也就是说在IDEA中并不会因为你 Ctrl + S 就重新编译代码。
在IDEA中,我们还需要在pom文件中,增加编译插件,让代码有变动的时候也编译
这样我们就可以在IDEA中手动的完成热加载了,为什么是手动热加载,因为这里我们在修改完代码后,按快捷键Ctrl+F9,手动构建项目,或者只修改单个类文件的话,按Ctrl+Shift+F9,重新编译该类文件,即可触发重启服务。
可能你会嫌弃这样过于麻烦,那么可以自动的进行热加载么?当然也是可以的,但是我们还需要在IDEA中进行一些设置,如下:
然后按快捷键Ctrl+Shift+Alt+/,选择1.Registry… ,勾选 compiler.automake.allow.when.app.running 即可。
最后我们再来简单来看一看项目打包部署的问题,如果我们想将一个项目打包进行部署,如果想达成jar包,首先我们需要在pom文件中新增相关配置,然后通过Maven进行打包即可
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
但是如果你并不希望使用内置的tomcat,希望部署到其他Tomcat服务器,那么就需要使用war包部署了。那么我们首先需要在pom文件中修改打包的方式
然后我们最好在剔除内置tomcat的支持,以避免和外部的Tomcat冲突
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!--
scope值的作用范围:
compile:默认值,适用于所有阶段,并且会随着项目直接发布
provided:编译和测试阶段有效,并且在运行时由服务器提供
runtime:运行时使用,对测试和运行有效,如jdbc
test:只在测试时使用,在编译和运行时不起作用,不发项目不起作用
system:不依赖maven仓库解析,需要提供依赖的显示路径,对项目的移植来说很不方便
-->
最后我们还需要修改SpringBoot的启动类,使其继承
org.springframework.boot.web.servlet.support.SpringBootServletInitializer,并重写configure方法