SpringBoot 项目去 Tomcat 转为非 Web 应用的两种方法

1,374 阅读2分钟

背景

笔者以往用 SpringBoot 开发的项目,要么用内置 Tomcat 打成可执行 jar ,要么打成 war 发布到外部 Tomcat 中,还没有遇到只用 SpringBoot 框架,但是不要 Web 的场景。

有一个是用 SpringBoot 技术开发的, Netty 提供 Web 服务后,就不需要内置的 Tomcat 来及其 Web 能力了。

怎么既剥离掉 Tomcat ,又能用 SpringBoot 及 Bean 的依赖管理呢?框架已经提供了这个能力。SpringBoot 项目去 Tomcat 转为非 Web 应用有两种方法,一起来回顾一下吧。

准备工作:去掉 Web 依赖配置

项目已经不需要 Tomcat 了,那么就需要在 pom.xml 中排除掉相关的 jar 包。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!--去除内嵌tomcat -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

或者干脆直接删掉 spring-boot-starter-web 依赖。

方法一:main 方法指定非 Web 应用

在 SpringBoot 启动类中,用 SpringApplicationBuilder 创建非 Web 的应用。

new SpringApplicationBuilder(MyApplication.class)
	    .web(WebApplicationType.NONE)
	    .run(args);

方法二:配置指定非 Web 应用

保持启动类不变,同时在 SpringBoot 的配置文件中添加如下配置:

spring:
  main:
    web-application-type: none

同时删掉无用的 server.tomcat 配置。

非 Web 应用启动日志

常规内置 Tomcat 启动的应用会打印 Tomcat 版本信息和启动端口:

 Initializing ProtocolHandler ["http-nio-XXX"]
 Starting service [Tomcat]
 Starting Servlet engine: [Apache Tomcat/9.0.21]

经过前面两种操作后,启动的应用就是普通 Java 项目了,看到这句就可以放心了:

[  restartedMain] xxx.MyAppliction  : 
Started MyAppliction in 71.436 seconds (JVM running for 76.232)

启示录

最初接到这个需求的时候,感觉实现这个功能应该会很麻烦,所以有一种本能的抗拒心理。

把基于 Servlet 的 RestController 对应的 Web 服务用 Netty 实现后,再去搜 SpringBoot 去 Web 的方法时,竟然如此简单哇!

引用《认知觉醒》里面的一段话共勉:

真正的困难总别想象的要小的多。人们拖延、纠结、畏惧、害怕的根本原因往往不是事情本身有多难,而是内心的想法变得模糊。模糊的边界一旦扩大,潜意识就出来作怪。即使是一些简单的小事情,潜意识也会觉得难以解决。

有人说:生活中处处都是“鸡汤”,我已经免疫了。

但是,还是需要时时让重要的道理进入我们的眼中、心中、脑中哇!

因为,道理都懂,但人真的很容易屈服于短期诱惑!