一、热部署
spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。
1.devtools的原理
深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
2.Spring Boot+Maven+thymeleaf热部署配置过程
2.1. application.properties文件中配置 spring.thymeleaf.cache=false 关闭页面缓存 页面修改后会立即生效
2.2. 在xml中定义devtools(devtools监听classpath下的文件变动,并且会立即重启应用)
org.springframework.boot
spring-boot-devtools
3.在xml的maven-plugin中增加(保证devtools在主线程上不会被关闭)
org.springframework.boot
spring-boot-maven-plugin
true
4.修改idea的设置,如果是eclipse可省略
4.1 file->setting->build->complier->build project auto.... 勾选
4.2 ctrl+shift+alt+/ 输入registry -》确保 complier.automake.... 被勾选(默认就是选中的)
6.测试
6.1修改配置文件–>保存:系统会重启
6.2修改类–>保存:系统会重启
6.3 修改页面–>保存:系统不会重启,页面刷新,会重新加载(原理是将spring.thymeleaf.cache设为false)
二、打包
1.打jar包
利用maven自带的命令打包
1.1.利用 mvn package 打成jar
方法一:新建一个configuration ---maven ---package 运行
方法二:直接利用maven窗口的plugins --jar ---双击jar.jar即可
我们可以看出方法一打包比方法二的打包的文件大很多,因为方法一中下载了项目所有的依赖的jar
1.2.利用java -jar xxx.jar 启动应用(windows环境)
1.3.在同级目录下添加配置文件,应用生效
修改配置文件中的端口后重新运行命令,启动项目,配置生效,结果如下
1.4.在linux环境下运行jar
后台运行:可以使用 Linux 的 nohup 命令,把进程挂起,后台执行
用法:
nohup java -jar xxx.jar >> xxx.log &
运行结果(这个数字是进程号): [1] 399
下面报了一个提示:$ nohup: ignoring input and redirecting stderr to stdout
这个影响不大,不用紧张,也可以加多一个 2>&1 就不会出现这个问题
用法:
nohup java -jar xxx.jar >> xxx.log & 2>&1 &
命令最后面的 & 符号是切换到后台去跑,退出终端也不会退出任务进程
运行这个命令之后呢,会输出一个进程号,类似上面的输出,可以使用 top 命令查看运行中的进程,也可以用 ps -aux 查看进程
TIPS:如果进程挂不起来,可能是端口被占用了,自行排查处理便可
1.5.在linux环境下终止jar
终止程序:想要终止这个进程的话只能杀死这个进程,使用 kill 指令处理
$ kill -9 进程号
查看进程端口,如下
中止进程之后就看不到8001的端口了
1.6.使用tail -f xxx.log 监控日志文件
tail -f stdout.log //查看日志
2.打war包
spring boot 默认打jar包但也支持打war包
步骤如下:
2.1 package : jar -> war
2.2增加pom ,在打包的时候不去加载内嵌tomcat的jar
org.springframework.boot
spring-boot-starter-tomcat
provided
//provided 在编译时这个Jar存在,但在打包和运行时,不将jar放到运行环境中
//complie 在编译、运行。发布的时候jar包都存在,这是一个默认是
//runtime 运行时,在本地编译时不用这个jar,在运行发布的时候将其加载放置到运行环境中
2.3原有入口类的main方法实效
//SpringBootServletInitializer的作用就是在tomcat启动的时候,执行内置的configure方法,将其托管给Spring Boot
@SpringBootApplication
public class DeployApplication extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
System.out.println("War包启动");
return builder.sources(DeployApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(DeployApplication.class, args);
}
}
2.4 打包 和上面maven打包jar一样运行
2.5运行
war包得放在tomcat的webapp中运行
三、源码
github地址: https://github.com/bitree1/spring-boot-deploy
如果有问题,请在下方评论
想获得更多的学习知识请关注微信公众号:西北码农或扫下方二维码