springboot 4大默认容器、指定运行容器

该文介绍了Spring Boot中如何自定义Web容器的启动顺序,以及如何将默认的Tomcat容器替换为Undertow、Jetty或Netty。通过排除`spring-boot-starter-tomcat`并引入其他容器的相关依赖,可以改变服务器执行的优先级。顺序为:Tomcat > Jetty > Undertow > Netty。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 总结:假如自定义依赖全部存在,则执行生效顺序依次为

    tomcat > jetty > undertow > netty

private static RequestUpgradeStrategy initUpgradeStrategy() {
		String className;
		if (tomcatPresent) {
			className = "TomcatRequestUpgradeStrategy";
		}
		else if (jettyPresent) {
			className = "JettyRequestUpgradeStrategy";
		}
		else if (jetty10Present) {
			className = "Jetty10RequestUpgradeStrategy";
		}
		else if (undertowPresent) {
			className = "UndertowRequestUpgradeStrategy";
		}
		else if (reactorNettyPresent) {
			// As late as possible (Reactor Netty commonly used for WebClient)
			className = "ReactorNettyRequestUpgradeStrategy";
		}
		else {
			throw new IllegalStateException("No suitable default RequestUpgradeStrategy found");
		}

		try {
			className = "org.springframework.web.reactive.socket.server.upgrade." + className;
			Class<?> clazz = ClassUtils.forName(className, HandshakeWebSocketService.class.getClassLoader());
			return (RequestUpgradeStrategy) ReflectionUtils.accessibleConstructor(clazz).newInstance();
		}
		catch (Throwable ex) {
			throw new IllegalStateException(
					"Failed to instantiate RequestUpgradeStrategy: " + className, ex);
		}
	}
  1. tomcat (默认)
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
</dependency>

在这里插入图片描述

  1. 将默认容器替换为 undertow 容器
<dependency>
  <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!-- 默认执行顺序:tomcat > jetty > undertow > netty-->
        <!-- 排除tomcat引入其他容器 -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 替换为 undertow -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

在这里插入图片描述

  1. 将默认容器替换为 jetty 容器
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
     <exclusions>
         <!-- 默认执行顺序:tomcat > jetty > undertow > netty-->
         <!-- 排除tomcat引入其他容器 -->
         <exclusion>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-tomcat</artifactId>
         </exclusion>
     </exclusions>
 </dependency>
 <!-- 替换为 jetty -->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-jetty</artifactId>
 </dependency>       

在这里插入图片描述

  1. 将默认容器替换为 netty 容器
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!-- 默认执行顺序:tomcat > jetty > undertow > netty-->
        <!-- 排除tomcat引入其他容器 -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
 <!-- 替换为 netty -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-reactor-netty</artifactId>
</dependency>

在这里插入图片描述

<think>问题:SpringBoot打包能否不用容器运行WAR?回答:是的,SpringBoot可以打包成WAR文件,并且可以不用外部容器直接运行。这是因为SpringBoot内嵌了Servlet容器(如TomcatJetty等)。我们可以通过以下两种方式运行WAR文件:1.传统方式:将WAR部署到外部Servlet容器(如Tomcat)中运行。2.内嵌容器方式:直接通过命令行运行WAR文件(无需预先安装容器),就像运行可执行JAR一样。如何实现直接运行WAR?步骤1:修改打包方式为WAR,并配置内嵌容器依赖。步骤2:确保主类继承`SpringBootServletInitializer`(这是为了支持外部容器部署,同时也支持直接运行)。步骤3:使用`java-jar`命令运行WAR。具体配置示例(Maven):1.修改`pom.xml`,将打包方式设置为`war`:```xml<packaging>war</packaging>```2.排除内嵌Tomcat的scope(可选,但通常不需要排除,因为SpringBoot已经处理好了):注意:如果你需要部署到外部容器,可以排除内嵌容器,但这里我们要直接运行,所以保留内嵌容器。3.添加SpringBootMaven插件:```xml<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>```4.主类示例:```javapackagecom.example.demo;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.boot.builder.SpringApplicationBuilder;importorg.springframework.boot.web.servlet.support.SpringBootServletInitializer;@SpringBootApplicationpublicclassDemoApplicationextendsSpringBootServletInitializer{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}@OverrideprotectedSpringApplicationBuilderconfigure(SpringApplicationBuilderbuilder){returnbuilder.sources(DemoApplication.class);}}```5.构建WAR文件:```bashmvncleanpackage```6.运行WAR文件:```bashjava-jartarget/demo-0.0.1-SNAPSHOT.war```解释:-SpringBootMaven插件会将项目打包成一个可执行的WAR文件,它内嵌了Servlet容器。-通过`java-jar`运行WAR时,内嵌的Servlet容器会启动,并加载应用。注意事项:-这种方式实际上还是使用了容器(内嵌容器),但不需要用户预先安装和配置外部容器。-如果你需要部署到外部容器,那么构建的WAR文件也可以直接部署到外部容器(如Tomcat)中。相关问题:§§相关问题§§:1.SpringBoot如何同时支持可执行JAR和WAR的打包?2.在外部Tomcat中部署SpringBootWAR时,如何配置?3.如何排除SpringBoot内嵌的Tomcat容器4.如何指定SpringBoot应用在外部容器中启动时的配置文件?</think>### Spring Boot打包:不用容器运行WAR 是的,Spring Boot可以打包成WAR文件并**不需要外部容器**就能直接运行。这是通过Spring Boot的嵌入式容器特性实现的。以下是详细解决方案: #### 解决方案步骤 1. **修改pom.xml配置**: ```xml <project> <!-- 设置打包方式为war --> <packaging>war</packaging> <dependencies> <!-- 嵌入式Tomcat依赖 (范围改为compile) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>compile</scope> <!-- 默认是provided,改为compile --> </dependency> </dependencies> <build> <plugins> <!-- Spring Boot Maven插件 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ``` 2. **修改主应用类**: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class Application extends SpringBootServletInitializer { // 直接运行入口 public static void main(String[] args) { SpringApplication.run(Application.class, args); } // 外部容器部署支持 @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Application.class); } } ``` 3. **构建和运行命令**: ```bash # 构建WAR文件 mvn clean package # 直接运行WAR(无需外部容器) java -jar target/your-application.war ``` #### 关键原理解释 1. **嵌入式容器**: - 将`spring-boot-starter-tomcat`作用域设为`compile`(默认是`provided`) - Tomcat作为应用的一部分被打包进WAR - 运行时自动启动嵌入式Tomcat 2. **双重运行模式**: - `java -jar`方式:使用嵌入式容器 - 外部容器部署:仍兼容传统方式(需将Tomcat依赖改回`provided`) 3. **WAR文件结构**: ``` your-app.war ├── WEB-INF │ ├── classes # 应用类文件 │ └── lib-provided # 嵌入式容器库 ├── META-INF └── org/springframework... # Spring Boot启动类 ``` #### 优势与注意事项 **优势**: - 单一文件部署:无需单独安装/配置Tomcat - 环境一致性:嵌入式容器确保开发/生产环境一致 - 云原生友好:适合容器化部署(Docker/K8s) **注意事项**: - 文件小:WAR文件包含容器,体积较 - 端口冲突:确保运行环境端口可用(默认8080) - 日志配置:嵌入式容器日志会输出到控制台 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值