在开发过程可以使用springboot内嵌的Tomcat容器进行调试并且可以进行热部署,
一、 热部署实现
当我们修改了类文件后,idea不会自动编译,得修改idea设置。
- (1)File-Settings-Compiler-Build Project automatically
- (2)ctrl + shift + alt + / ,选择Registry,勾上 Compiler autoMake allow when app running
在pom.xml文件引用devtools依赖
<!-- devtools热部署 -->
<dependency> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency>
<build> <plugins>
<plugin>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <fork>true</fork> </configuration> </plugin> </plugins> </build>
二、springboot工程部署到外部容器
前提pom.xml中配置
<packaging>war</packaging>
1、排除spring-boot-starter-web依赖中的tomcat组件
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!--<exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions>--> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>
2、再引入必要的servlet-api
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency>
3、在springboot启动类中继承SpringBootServletInitializer类并重写configure方法
/** * @author han.sun */ @SpringBootApplication @ServletComponentScan public class DemoApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(DemoApplication.class); } }
4、builder工程代码部署外部容器(有坑)
当我把代码exploded或者war包部署到jetty或者tomcat的webapps目录,出现以下错误
原因打印的exception的stackTrace显示可devtools restart
查看devtools包下的源代码
显示org.springframework.boot.devtools.RemoteSpringApplication此类中有一个springboot启动器,
一个项目中不能有多个springboot main方法;
网上还有一种解决方案是进行指定运行时springboot的启动类,未能有成效
解决方案: idea可以在打包的时候devtools这个jar 不进行put到lib目录下。
未完待续