前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot外置Tomcat

SpringBoot外置Tomcat

作者头像
神奇的程序员
发布2022-04-10 09:30:44
5050
发布2022-04-10 09:30:44
举报

前言

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

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

项目配置

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

配置包管理文件

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

代码语言:javascript
复制
<!--打包格式为war-->
<packaging>war</packaging>

排除内置tomcat

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

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

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

websocket相关

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

  • pom.xml中的依赖
代码语言:javascript
复制
<!--添加websocket支持-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
  • websocket的启动配置,代码如下
代码语言:javascript
复制
package com.lk.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * websocket启动配置
 */
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

设置打包名与路径

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

代码语言:javascript
复制
<!--打包的目录-->
<directory></directory>
<!--打包时的文件名-->
<finalName></finalName>

修改启动类

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

代码语言:javascript
复制
@SpringBootApplication
public class ChatSystemServerApplication extends SpringBootServletInitializer {
 // 外置tomcat需要继承SpringBootServletInitializer,重写SpringApplicationBuilder
 @Override
 protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
  return application.sources(ChatSystemServerApplication.class);
 }
 public static void main(String[] args) {
  SpringApplication.run(ChatSystemServerApplication.class, args);
 }
}

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

tomcat配置

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

开启https访问

我们打开tomcat的conf目录下的server.xml,找到name为CatalinaService标签里的<Connector port="" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="" />标签,修改portredirectPort属性,代码如下:

代码语言:javascript
复制
<!--开启https访问-->
<Connector port="80" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="443"/>

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

代码语言:javascript
复制
<!--非80端口的访问跳转到443端口-->
<Connector executor="tomcatThreadPool"
           port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="443"/>

配置SSL证书

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

代码语言:javascript
复制
<!--配置SSL证书-->
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true">
     <SSLHostConfig>
          <Certificate certificateKeystoreFile="conf/server.jks"
                     certificateKeystorePassword=""
                     type="RSA"/>
     </SSLHostConfig>
</Connector>

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

配置路径访问

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

在server.xml文件中,找到<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">标签,在其中添加Context标签,代码如下:

代码语言:javascript
复制
 <!--配置路径访问-->
<Context path="" docBase=""></Context>

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

设置默认首页

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

代码语言:javascript
复制
// 默认首页映射
@Controller
public class DefaultController {
    @RequestMapping("/")
    public String Welcome(){
        return "forward:index.html";
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 神奇的程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 项目配置
    • 配置包管理文件
      • 排除内置tomcat
        • websocket相关
          • 设置打包名与路径
            • 修改启动类
            • tomcat配置
              • 开启https访问
                • 配置SSL证书
                  • 配置路径访问
                    • 设置默认首页
                    相关产品与服务
                    SSL 证书
                    腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档