聊一聊如何SpringBoot外置Tomcat

服务器
在部署我开源项目后端代码时,一直采用的jar包形式,一开始觉得没什么问题,挺方便的,这几天后端代码改动比较频繁,打成jar包后,每次更新都需要去服务器停止旧的服务,过于繁琐。

[[360688]]

本文转载自微信公众号「神奇的程序员K」,作者神奇的程序员K 。转载本文请联系神奇的程序员K公众号。

前言

在部署我开源项目后端代码时,一直采用的jar包形式,一开始觉得没什么问题,挺方便的,这几天后端代码改动比较频繁,打成jar包后,每次更新都需要去服务器停止旧的服务,过于繁琐。

索性直接采用外置tomcat吧,打成war包方便一点,本文就跟大家分享下我的实现过程,欢迎各位感兴趣的开发者阅读本文。

项目配置

我用的SpringBoot版本为2.x,Tomcat版本为9.x,jdk版本为1.8,使用maven来管理项目,接下来就跟大家分享下我的实现过程。

配置包管理文件

打开项目根目录的pom.xml文件,在project标签下声明打包格式为war,代码如下所示:

  1. <!--打包格式为war--> 
  2. <packaging>war</packaging> 

排除内置tomcat

打包时默认会将内置的tomcat打包进去,这就造成了冲突问题,所以此处我们需要将内置的排除掉,在dependencies标签下添加下述依赖。

  1. <!--当打war包到tomcat时,自动排除内置的tomcat,避免二者产生冲突--> 
  2. <dependency> 
  3.   <groupId>org.springframework.boot</groupId> 
  4.   <artifactId>spring-boot-starter-tomcat</artifactId> 
  5.   <!--打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。 
  6.                 相当于compile,但是打包阶段做了exclude操作--> 
  7.   <scope>provided</scope> 
  8. </dependency> 

此处还有一个做法是在spring-boot-starter-web依赖内排除掉依赖内排除掉tomcat,这样做他会把websocket相关的包也给排除掉,你项目内的websocket就没法使用了,需要手动多引入javax.websocket-api这个依赖,这个依赖的最后更新时间是2016年,所以不推荐使用这个方法。

websocket相关

既然使用了外置tomcat,那么原先使用内置tomcat所配置的东西就可以删除了(当然,你不删也是可以的,但是为了代码规范最好还是删掉吧),我这里删除的东西如下:

  • pom.xml中的依赖
  1. <!--添加websocket支持--> 
  2. <dependency> 
  3.   <groupId>org.springframework.boot</groupId> 
  4.   <artifactId>spring-boot-starter-websocket</artifactId> 
  5. </dependency> 
  • websocket的启动配置,代码如下
  1. package com.lk.config; 
  2.  
  3. import org.springframework.context.annotation.Bean; 
  4. import org.springframework.context.annotation.Configuration; 
  5. import org.springframework.web.socket.server.standard.ServerEndpointExporter; 
  6.  
  7. /** 
  8.  * websocket启动配置 
  9.  */ 
  10. @Configuration 
  11. public class WebSocketConfig { 
  12.     @Bean 
  13.     public ServerEndpointExporter serverEndpointExporter() { 
  14.         return new ServerEndpointExporter(); 
  15.     } 

设置打包名与路径

如果不设置名字和路径默认的打包名会附带带版本号,打包路径在当前项目的的target目录下,我们可以通过在pom.xml中的build标签下对其进行自定义,代码如下:

  1. <!--打包的目录--> 
  2. <directory></directory> 
  3. <!--打包时的文件名--> 
  4. <finalName></finalName> 

修改启动类

接下来,我们修改下SpringBoot的启动类,让其继承SpringBootServletInitializer,重写configure方法,告诉它我们使用的是外置Tomcat,代码如下:

  1. @SpringBootApplication 
  2. public class ChatSystemServerApplication extends SpringBootServletInitializer { 
  3.  // 外置tomcat需要继承SpringBootServletInitializer,重写SpringApplicationBuilder 
  4.  @Override 
  5.  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
  6.   return application.sources(ChatSystemServerApplication.class); 
  7.  } 
  8.  public static void main(String[] args) { 
  9.   SpringApplication.run(ChatSystemServerApplication.class, args); 
  10.  } 

至此,我们的项目配置部分就完成了,我们刷新下pom.xml文件,在idea的maven工具栏点clean,然后点package,就可以打一个war包在target目录下了。

tomcat配置

我的项目启用了https,使用外置tomcat后,在application.yml中配置的https就失效了,我们需要在tomcat中重新配一下。

开启https访问

我们打开tomcat的conf目录下的server.xml,找到name为Catalina的Service标签里的标签,修改port和redirectPort属性,代码如下:

随后,在上述标签的后面加上下述代码,让非80端口的访问跳转到443端口

配置SSL证书

把域名的证书文件server.jks和keystorePass.txt文件放在conf目录下,在server.xml中的name为Catalina的Service标签里添加下述代码。

  1. <!--配置SSL证书--> 
  2. <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" 
  3.            maxThreads="150" SSLEnabled="true"
  4.      <SSLHostConfig> 
  5.           <Certificate certificateKeystoreFile="conf/server.jks" 
  6.                      certificateKeystorePassword="" 
  7.                      type="RSA"/> 
  8.      </SSLHostConfig> 
  9. </Connector> 

certificateKeystoreFile为你的证书文件,certificateKeystorePassword为你的证书文件密码,这个密码在keystorePass.txt文件里

配置路径访问

将war包放入tomcat的webapps目录下后,我们想反问需要带上项目名才可以,如果我们不想加项目名就能直接访问我们的项目,就需要另作配置了。

在server.xml文件中,找到标签,在其中添加Context标签,代码如下:

  1. <!--配置路径访问--> 
  2. Context path="" docBase=""></Context> 

path: 留空则表示为域名根目录,docBase为你的war包所在目录

设置默认首页

由于我们修改了tomcat的默认访问页面,所有的根目录访问时不会走ROOT目录下的页面,此时就需要在项目里配置一个根目录的映射,让其跳转到我们指定的项目内的ststic中的页面,代码如下:

  1. // 默认首页映射 
  2. @Controller 
  3. public class DefaultController { 
  4.     @RequestMapping("/"
  5.     public String Welcome(){ 
  6.         return "forward:index.html"
  7.     } 

 

责任编辑:武晓燕 来源: 神奇的程序员k
相关推荐

2021-02-20 06:15:00

项目SpringBoot热部署

2020-06-02 15:06:13

Tomcat配置页面

2018-05-16 08:58:04

用户画像存储

2018-11-30 12:48:36

SDS故障硬件

2023-03-05 18:40:39

iptables防火墙软件

2018-06-07 13:17:12

契约测试单元测试API测试

2023-09-22 17:36:37

2021-01-28 22:31:33

分组密码算法

2020-05-22 08:16:07

PONGPONXG-PON

2019-09-19 16:59:04

数据结构设计数据库

2020-06-28 09:30:37

Linux内存操作系统

2022-10-08 11:33:56

边缘计算云计算

2022-11-26 00:00:06

装饰者模式Component

2020-08-12 08:34:16

开发安全We

2021-01-01 09:01:05

前端组件化设计

2020-09-08 06:54:29

Java Gradle语言

2022-03-08 16:10:38

Redis事务机制

2018-01-10 14:13:04

测试矩阵API测试

2022-03-29 09:56:21

游戏版本运营

2019-12-17 10:06:18

CDMA高通4G
点赞
收藏

51CTO技术栈公众号