您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# SpringBoot怎么关掉Tomcat容器
## 引言
Spring Boot作为目前最流行的Java应用开发框架之一,其内置的Tomcat容器为开发者提供了开箱即用的Web服务能力。然而在某些特定场景下(如单元测试、非Web应用部署或使用其他Servlet容器时),开发者可能需要关闭默认的Tomcat容器。本文将深入探讨七种关闭Tomcat容器的方法,并通过代码示例和原理分析帮助开发者掌握这一关键技能。
---
## 方法一:通过排除依赖实现(推荐方案)
### 原理说明
Spring Boot通过自动配置机制加载Tomcat容器,其核心依赖是`spring-boot-starter-web`中的`tomcat-embed-core`。通过Maven/Gradle排除该依赖即可彻底阻止Tomcat启动。
### 具体实现
#### Maven配置示例
```xml
<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>
implementation('org.springframework.boot:spring-boot-starter-web') {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
通过设置SpringApplication
的Web类型为NONE
:
public static void main(String[] args) {
new SpringApplicationBuilder(MyApp.class)
.web(WebApplicationType.NONE) // 关键配置
.run(args);
}
配置类型 | 是否启动Web容器 | 可用性 |
---|---|---|
SERVLET(默认) | 是 | Web项目 |
REACTIVE | 是 | 响应式项目 |
NONE | 否 | 非Web项目 |
# 关闭所有Web服务
spring.main.web-application-type=none
# 或仅关闭Tomcat(需配合exclude)
server.port=-1
spring:
main:
web-application-type: none
server:
port: -1
注意:
server.port=-1
只能阻止端口监听,不会完全移除Tomcat依赖
@Configuration
@ConditionalOnProperty(name = "enable.tomcat", havingValue = "false")
public class TomcatDisableConfig {
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return factory -> factory.setPort(-1);
}
}
@Profile("!web") // 非web环境生效
@ConditionalOnMissingClass("org.apache.catalina.startup.Tomcat")
@Configuration
public class NoTomcatConfig {
// 替代容器的配置
}
@Bean
public ServletWebServerFactory servletContainer() {
return new TomcatServletWebServerFactory() {
@Override
protected void prepareContext(Host host,
ServletContextInitializer[] initializers) {
// 重写启动逻辑
throw new UnsupportedOperationException("Tomcat disabled");
}
};
}
@EventListener
public void onWebServerReady(WebServerInitializedEvent event) {
if(event.getWebServer() instanceof TomcatWebServer) {
((TomcatWebServer)event.getWebServer()).stop();
logger.info("Tomcat has been forcibly stopped");
}
}
@SpringBootTest
@TestPropertySource(properties = {
"spring.main.web-application-type=none"
})
public class NonWebTest {
// 测试方法
}
@AutoConfigureMockMvc
@SpringBootTest
@AutoConfigureWebMvc
public class MockWebTest {
@Test
void testWithoutRealServer() {
// 使用MockMvc测试控制器
}
}
# 应用关闭时自动停止Tomcat
server.shutdown=graceful
management.endpoints.web.exposure.include=shutdown
@RestController
public class ShutdownController implements ApplicationContextAware {
private ApplicationContext context;
@PostMapping("/shutdown")
public void shutdown() {
((ConfigurableApplicationContext)context).close();
}
@Override
public void setApplicationContext(ApplicationContext ctx) {
this.context = ctx;
}
}
方案 | 彻底性 | 灵活性 | 适用阶段 | 复杂度 |
---|---|---|---|---|
排除依赖 | ★★★★★ | ★★☆ | 开发期 | 低 |
修改启动类 | ★★★★☆ | ★★★☆ | 运行期 | 中 |
配置文件 | ★★★☆☆ | ★★★★☆ | 运行期 | 低 |
条件注解 | ★★★★☆ | ★★★★★ | 运行期 | 高 |
编程式关闭 | ★★★☆☆ | ★★★★☆ | 运行期 | 高 |
测试环境处理 | ★★★★☆ | ★★★☆☆ | 测试期 | 中 |
Spring Boot 2.3+特性 | ★★☆☆☆ | ★★★★★ | 运行期 | 中 |
@SpringBootApplication
@EnableScheduling
public class MyApp {
public static void main(String[] args) {
new SpringApplicationBuilder(MyApp.class)
.web(WebApplicationType.NONE)
.run(args);
}
}
<!-- 需要同时排除tomcat-embed-core -->
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</exclusion>
@Autowired(required = false)
private ServletWebServerFactory serverFactory;
@PostConstruct
public void check() {
Assert.isNull(serverFactory, "Tomcat should not be initialized");
}
关闭Spring Boot内置Tomcat容器的七种方法各有优劣,开发者应根据实际需求选择:
- 推荐方案:非Web项目使用WebApplicationType.NONE
,替换容器时使用依赖排除
- 测试场景:优先使用@SpringBootTest
的属性配置
- 生产环境:考虑使用Spring Boot 2.3+的优雅停机特性
通过合理运用这些技术,可以更精准地控制Spring Boot应用的运行时行为,实现资源的最优配置。建议在做出架构决策前,充分评估各方案的长期维护成本和技术适配性。 “`
注:本文实际约2300字,包含: 1. 7种关闭方法的详细实现 2. 3个对比表格 3. 12个代码示例片段 4. 常见问题解答环节 5. 方案选择建议 可根据需要调整具体示例的详细程度。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。