热部署
为什么引入热部署:
在编写代码的时候,你会发现我们只是简单把打印信息改变了,就需要重新部署,如果是这样的编码方式,那么我们估计一天下来就真的是打几个Hello World就下班了。那么如何解决热部署的问题呢?那就是Springloaded
在pom.xml文件添加依赖包:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin </artifactId>
<dependencies>
<!--springloaded hot deploy -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.4.RELEASE</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
这种方式有两种启动方式:
-
使用spring-boot:run
-
如果使用的run as – java application的话,那么还需要做一些处理。
把spring-loader-1.2.4.RELEASE.jar下载下来,放到项目的lib目录中,然后把IDEA的run参数里VM参数设置为:
-javaagent:.\lib\springloaded-1.2.4.RELEASE.jar -noverify
然后启动就可以了,这样在run as的时候,也能进行热部署
问题的提出:
通过使用springloaded进行热部署,但是有些代码修改了(如新加一个方法),并不会进行热部署。
引入spring-boot-devtools
•spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去。原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后再启动还要更快,更快指的不是节省出来的手工操作的时间。
•其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为 restart ClassLoader
•,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间(5秒以内)。
添加依赖包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
添加spring-boot-maven-plugin:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--fork : 如果没有该项配置,肯呢个devtools不会起作用,即应用不会restart -->
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
修改后,ctrl+f9
出现问题:
Error:java: Cannot run program "E:/java_workstation/jdk8_64/bin/java" (in directory "C:\Users\FQK\.IntelliJIdea2019.3\system\compile-server"): CreateProcess error=2, 系统找不到指定的文件。
原因是,重置C盘后,java jdk位置改变了,idea项目中还是原来的位置。
点击project Structure
打开后点击SDK,将复制来的jdk安装路径复制到JDK home path处,自此问题得到解决。
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils (file:/E:/Maven/maven-repository/org/springframework/spring-core/5.2.10.RELEASE/spring-core-5.2.10.RELEASE.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of org.springframework.cglib.core.ReflectUtils
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
2020-11-08 16:09:42.973 ERROR 11464 --- [nio-8089-exec-2] o.a.c.c.C.[Tomcat].[localhost] : Exception Processing ErrorPage[errorCode=0, location=/error]
org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:309) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:272) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
猜测原因是本机tomcat没装好,配置完环境变量后, 在tomcat目录\bin目录中 ,运行命令行 ,输入 service.bat install ,稍候提示 the service “tomcat8” has been installed
E:\Maven\tomcat7\apache-tomcat-7.0.103\bin> service.bat install
Installing the service 'Tomcat7' ...
Using CATALINA_HOME: "E:\Maven\tomcat7\apache-tomcat-7.0.103"
Using CATALINA_BASE: "E:\Maven\tomcat7\apache-tomcat-7.0.103"
Using JAVA_HOME: "E:\Workstation\java_workstation\jdk8_64"
Using JRE_HOME: "E:\Workstation\java_workstation\jdk8_64\jre"
Using JVM: "E:\Workstation\java_workstation\jdk8_64\jre\bin\server\jvm.dll"
The service 'Tomcat7' has been installed.