如何配置Maven使Tomcat仅本地运行包含,打包WAR时排除?
解决Spring Boot本地运行含Tomcat、WildFly打包WAR排除Tomcat的配置
1. 配置Maven依赖与Profiles
在pom.xml中通过Maven Profile区分本地开发和WildFly打包场景,实现Tomcat依赖的按需引入:
<!-- 基础Spring Boot Web依赖,先排除默认内置Tomcat --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 单独声明Tomcat依赖,默认scope为provided(打包WildFly WAR时不包含) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <!-- 配置Maven Profiles --> <profiles> <profile> <id>local</id> <activation> <!-- 默认激活本地Profile,IDE运行、mvn spring-boot:run自动生效 --> <activeByDefault>true</activeByDefault> </activation> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>compile</scope> </dependency> </dependencies> </profile> <profile> <id>wildfly</id> <!-- 打包时通过-Pwildfly手动激活,或设置条件自动激活 --> </profile> </profiles> <!-- 确保打包类型为WAR --> <packaging>war</packaging>
2. 调整Spring Boot启动类
因为是WAR包部署,启动类需要继承SpringBootServletInitializer,保证WildFly能正确加载应用:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class YourAppApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(YourAppApplication.class); } public static void main(String[] args) { SpringApplication.run(YourAppApplication.class, args); } }
3. 运行与打包操作
- 本地运行:直接在IDE中启动main方法,或执行
mvn spring-boot:run,此时localProfile默认激活,Tomcat依赖会被引入,不会出现ServletWebServerFactory缺失错误。 - 构建WildFly WAR包:执行
mvn clean package -Pwildfly,此时wildflyProfile激活,Tomcat依赖保持provided状态,打包后的WAR包不包含Tomcat,可直接部署到WildFly。
内容的提问来源于stack exchange,提问作者Salvatore Montagna
相关产品推荐
相关产品推荐

