Spring Boot Maven WAR打包细节及Tomcat配置优先级咨询
Maven打包Spring Boot应用为WAR包的具体过程
1. 修改项目打包类型
在项目根目录的pom.xml中,将打包类型从默认的jar改为war:
<packaging>war</packaging>
2. 处理嵌入式Tomcat依赖
Spring Boot的spring-boot-starter-web默认包含嵌入式Tomcat依赖。为避免打包后与外部Tomcat冲突,需要将嵌入式Tomcat依赖的作用域设为provided——这个作用域意味着依赖仅在编译和测试阶段生效,打包时不会被包含进WAR包:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
如果使用Jetty等其他嵌入式容器,只需替换对应依赖并设置相同的provided作用域即可。
3. 修改启动类适配外部容器
让项目的启动类继承SpringBootServletInitializer,并重写configure方法,确保外部Tomcat能正确加载Spring Boot应用上下文:
@SpringBootApplication public class DemoApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(DemoApplication.class); } public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
这样修改后,应用既可以通过main方法用嵌入式Tomcat启动,也能部署到外部Tomcat运行。
4. 执行Maven打包命令
在项目根目录下运行以下命令完成打包:
mvn clean package
打包完成后,生成的WAR包会存放在项目的target目录中。
外部Tomcat部署时的配置优先级
当WAR包部署到外部Tomcat时,Tomcat服务器的server.xml(以及web.xml、context.xml等容器级配置文件)的优先级高于Spring Bootapplication.properties/application.yml中的Tomcat相关配置。
具体逻辑:
- Spring Boot内的Tomcat配置仅对嵌入式Tomcat生效,部署到外部容器时,这些配置会被直接忽略。
- 外部Tomcat的容器级配置是全局生效的,应用的运行端口、线程池、连接超时、SSL设置等都会遵循外部Tomcat的配置。
举个例子:如果application.properties中设置了server.port=8081,但外部Tomcatserver.xml里<Connector>标签的port属性为8080,那么应用最终会在8080端口提供服务。
内容的提问来源于stack exchange,提问作者Tejas S
相关产品推荐
相关产品推荐

