provided
Spring Boot 版本: 2.3.2.RELEASE
SpringBoot官方文档——Create a Deployable War File
SpringBoot的 Web模块 默认内嵌了Tomcat作为Servlet容器,因此,我们可以直接编写SpringBoot 启动类,直接通过启动类,一键开启Tomcat服务,确实是 nb plus!!!
但是,有些情况下,我们的Tomcat服务器,需要另外专门部署,会更好维护,此时,我们就考虑排除SpringBoot 的 Web模块中的Tomcat依赖,进而可以将SpringBoot应用部署到外部的Tomcat容器中。
修改 pom.xml 文件,修改打包方式为 war
<groupId>com.springboot.templategroupId>
<artifactId>servlet-container-warartifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>warpackaging>
这里有两种方案:(官方文档使用第一种)
provided
修改 pom.xml 文件,将嵌入的Tomcat依赖方式改成
provided
(编译、测试时将依赖的包加入本工程的classpath,运行时不加入,可以理解成运行时不使用Spring Boot 自带的Tomcat),确保嵌入式servlet容器不干扰war文件所部署到的servlet容器。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
<scope>providedscope>
dependency>
注意:
将SpringBoot的Web模块 提供的嵌入式servlet容器依赖关系标记为provided
时,将生成可执行的war文件,其中提供的依赖关系打包在lib提供的目录中。
这意味着,除了可以部署到servlet容器之外,还可以通过在命令行上使用java -jar
运行该应用程序。
修改 pom.xml 文件,在引入的Web模块处修改,如下:
排除内嵌的Tomcat依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
exclusion>
exclusions>
dependency>
由于排除了Tomcat依赖,没有了servlet实现,因此,需要引入servlet依赖
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>4.0.1version>
dependency>
注意:
Spring Boot 必须在Servlet 3.0规范以上容器中运行。
如果打算以 war 或 jar (可执行应用程序) 的形式启动应用程序,则需要使用
SpringBootServletInitializer
回调可用的configure
方法和类似于以下类的main方法中的共享方法来共享构建器的自定义项:
// 修改 SpringBoot 启动类
// 继承 SpringBootServletInitializer 类
// 重写 configure 方法
@SpringBootApplication
public class SpringBootStartApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
configureApplication(new SpringApplicationBuilder()).run(args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return configureApplication(builder);
}
private static SpringApplicationBuilder configureApplication(SpringApplicationBuilder builder) {
return builder.sources(Application.class).bannerMode(Banner.Mode.OFF);
}
}
在SpringBoot中我们平常用main方法启动的方式,都有一个SpringBootApplication
的启动类,类似代码如下:
@SpringBootApplication
public class SpringBootStartApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootStartApplication.class, args);
}
}
而我们现在需要类似于web.xml
的配置方式来启动spring应用,为此,我们在SpringBootStartApplication
类的同级上添加一个ServletInitializer
类,其代码如下:
// 继承 SpringBootServletInitializer 类
// 重写 configure 方法
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 传入SpringBoot应用的主程序
// 自定义应用程序或调用application.sources(...)以添加源
// 由于我们的示例本身就是@Configuration类(通过@SpringBootApplication)
// 我们实际上不需要重写此方法
return builder.sources(ServletContainerWarApplication.class);
}
}
修改完成后, 记得apply,就会生成webapp目录,以及目录下的 /WEB-INF/web.xml 文件
在项目根目录下(即包含pom.xml
的目录)(命令行 或 终端)执行maven打包操作:
mvn clean package
等待打包完成,出现 [INFO] BUILD SUCCESS
即为打包成功
或者,直接使用 IDEA 打包
将war包放到Tomcat的weapps目录下,启动服务器就可以使用了
http://你的域名或IP地址:[端口号]/[打包项目名]