当我们用Gradle做为项目管理工具时,创建一个SpringBoot外置TomCat项目,往往不能够正确启动Tomcat服务器,易出现以下几个问题:
- 找不到web模板
Tomcat找不到web模块,就会导致开启服务器时候报类似 XXXX.war not found for the web module 的错误!出现这种情况的主要原因是:在Gradle项目管理工具下,Gradle编译器不会自动创建exploded目录,所以Tomcat是无法找到这个目录
但是Tomcat需要找到这个目录才能正常运行,所以,没有的话,肯定会抛出异常,如果想不抛出异常,有两种设置
- 在tomcat服务器的编辑配置中,将服务器启动时部署设置为
.war结束的包
,这种情况,容易出现很多问题。 - 如果是以.war(exploded)结束的包进行部署,那么需要将构建工具Gradle在构建对选择框中,选择
intelliJIDEA
具体流程如下图:
如何使用SpringBoot中外部Servlet的容器
使用内置Servlet容器,需要将应用打包成jar包,Jar包通过java激活内置的Servlet容器,其特点为:
- 优点:简单、方便
- 缺点:不支持Jsp、可定制性比较差,想做一些性能优化可配置性差
使用自定义的Servlet容器,需要将应用打包成war包,然后通过外部的Servlet容器进行加载
- 优点:可支持JSP。可配置性强!
具体创建步骤如下:
1.创建一个关于war包的工程
创建的war包,和之前的的jar有如下几点区别
- 打包方式是war
<packaging>war</packaging>
- 将内置的tomcat的scope配置为provided
在maven中的写法
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.5.2</version>
<scope>provided</scope>
</dependency
在Gradle中的写法
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
- 多了一个继承于SpringBootServletInitializer的类ServletInitializer,他是做为一个启动应用的一个类
这个类要求:
- 这个类必须继承:SpringBootServletInitializer
- j必须重写SpringBootServletInitializer这个类的方法configure
- 必须调用application.source()这个方法,而且里面的参数是必须是主程序类的结构信息
@SpringBootApplication
// TODO: 2021/7/22 必须继承于接口SpringBootServletInitializer
public class CustomerMainClass extends SpringBootServletInitializer {
// TODO: 2021/7/22 重写方法configure
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
SpringApplicationBuilder sources = builder.sources(CustomerMainClass.class);
return sources;
}
public static void main(String[] args) {
SpringApplication.run(CustomerMainClass.class,args);
}
}
2.构建完成web应用目录结构
war中,完整的应用目录结构需要有webapp,和webapp里面的WEB-INF,及web.xml
- 通过手动创建(这种情况在熟知目录结构的情况下比较适合!)
- 通过项目结构来创建
注意点:对于war包,只有tomcat8.0以上的版本才能够识别,而且,无论是用Maven项目管理工具,还是Gradle项目管理工具,都必须考虑到JDK版本,启动模板(像Gradle就不能启动.war(exploded)模块,只能修改Gradle中的设置为InteliJIDEA才能运行。