参考代码:https://img.mukewang.com/down/5a73fba7000110f900000000.zip
1、热部署与热加载的联系和区别
2、热部署的原理与实现
3、构建Spring Boot项目的流程
4、Spring Boot热部署的实现与发布方式
使用场景
本地调试
线上发布
热部署与热加载
1、联系和区别
联系:不重启服务器编译/部署项目
基于Java的类加载器实现
部署方式:热部署在服务器运行时重新部署项目。
热加载在运行时重新加载class
实现原理:热部署直接重新加载整个应用
热加载
热部署 | 热加载 | |
---|---|---|
编译/部署项目 | 不重启服务器 | 不重启服务器 |
实现 | 基于Java的类加载器实现 | 基于Java的类加载器实现 |
部署方式 | 在服务器运行时重新部署项目 | 在运行时重新加载class |
实现原理 | 直接重新加载整个应用 | 在运行时重新加载class |
使用场景 | 更多的是在生产环境中使用 | 更多的是在开发环境使用 |
热部署原理解析
Java类的加载过程
1 | 初始化JVM | |
2 | 产生启动类加载器 | 子类,自动加载 |
3 | 标准扩展类加载器 | 子类,自动加载 |
4 | 系统类加载器 | |
5 | 加载class文件 | 交给其父类加载 |
类加载的5个阶段:
序号 | 阶段 | 备注 |
---|---|---|
1 | 加载 | |
2 | 验证 | |
3 | 准备 | |
4 | 解析 | |
5 | 初始化 |
Java类加载器的特点:
1、由AppClassLoader(系统类加载器),开始加载指定的类
2、类加载器将加载任务交给其父,如果其父找不到,再由自己去加载
3、Bootstrap Loader(启动类加载器)是最顶级的类加载器。
Java类的热部署:
1、类的热加载
2、配置Tomcat
通过类的热加载实现热部署
通过配置Tomcat实现热部署
1、直接把项目web文件夹放在webapps里。
2、在tomcat\conf\server.xml中的<host>内部添加<context/>标签。
<Context debug="0" docBase="D:/Imooc/web" path="/hot" privileged="true" reloadable="true"/>
3、在%tomcat_home%\conf\Catalina\localhost中添加一个XML
hot.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="D:/Imooc/web" reloadable="true"/>
JAVA类热加载案例分析
*.java | 介绍 | |
---|---|---|
1 | MyClassLoader.java | 核心类。自定义Java类加载器来实现Java类的热加载。继承于ClassLoader |
2 | BaseManager.java | 接口。实现这个接口的子类需要动态更新 |
3 | MyManager.java | BaseManager的子类。此类需要实现java类的热加载功能 |
4 | LoadInfo.java | 封装加载类的信息 |
5 | ManagerFactory.java | 加载manager的工厂 |
6 | MsgHandler.java | 后台启动一条现场不断刷新重新加载实现了热加载的类 |
7 | ClassLoaderTest.java | 测试java类的热加载 |
我没有实现热加载的现象。
SpringBoot创建项目
创建一个项目,并打印“Hello!”
过程略。
SpringBoot热部署的实现
1、Spring Loaded
2、spring-boot-devtools
Springloaded热部署实现
1、Maven启动方式,在pom.xml添加依赖
1) 在pom.xml的build中添加dependency
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.6.RELEASE</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
2) window的CMD窗口,到项目的目录下,运行命令:mvn spring-boot:run
启动的好慢。
运行项目正常,但是没有热启动的现象。
IDEA自动编译参考:https://www.cnblogs.com/jiangbei/p/8439394.html
仍然没有热启动的现象。
2、run as -java application
1)下载jar包
2)run configuration
VM options: -javaagent:D:\mvnrepo\repository\org\springframework\springloaded\1.2.6.RELEASE\springloaded-1.2.6.RELEASE.jar -noverify
-->Apply->RUN
运行项目正常,运行项目正常,刷新URL然后报错。
HTTP Status 500 – Internal Server Error
spring-boot-devtools热部署实现
pom.xml添加依赖:
<dependency><!-- 热部署依赖 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
运行正常,热部署正常。
发布方式
1、构建Jar包,命令行运行Spring Boot程序
2、构建War包,发布到Tomcat
构建Jar包
1、IDEA:右边的Maven Projects->install
Eclipse: Run As->Maven install
2、运行jar包:到目录下,运行: java -jar demo.jar
构建War包
1、添加tomcat依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</dependency>
2、修改代码HotbuilderApplication.java
@SpringBootApplication
public class HotbuilderApplication extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(HotbuilderApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(HotbuilderApplication.class, args);
}
}
3、IDEA:右边的Maven Projects->install
生成WAR包,
将此WAR包放到apache-tomcat-9.0.11\webapps\里。
启动tomcat:apache-tomcat-9.0.11\bin\start.bat