背景
笔者以往用 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 的方法时,竟然如此简单哇!
引用《认知觉醒》里面的一段话共勉:
真正的困难总别想象的要小的多。人们拖延、纠结、畏惧、害怕的根本原因往往不是事情本身有多难,而是内心的想法变得模糊。模糊的边界一旦扩大,潜意识就出来作怪。即使是一些简单的小事情,潜意识也会觉得难以解决。
有人说:生活中处处都是“鸡汤”,我已经免疫了。
但是,还是需要时时让重要的道理进入我们的眼中、心中、脑中哇!
因为,道理都懂,但人真的很容易屈服于短期诱惑!