阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

SpringBoot外置Tomcat

51次阅读
没有评论

共计 3256 个字符,预计需要花费 9 分钟才能阅读完成。

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

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

项目配置

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

配置包管理文件

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

<packaging>war</packaging>
排除内置 tomcat

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

<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 中的依赖

<!-- 添加 websocket 支持 -->
<dependency> 
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

websocket 的启动配置,代码如下

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 标签下对其进行自定义,代码如下:

<directory></directory>
 
<finalName></finalName>
修改启动类

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

@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 为 Catalina 的 Service 标签里的标签,修改 port 和 redirectPort 属性,代码如下:

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

配置 SSL 证书

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

<!-- 配置 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 文件中,找到标签,在其中添加 Context 标签,代码如下:

<Context path=""docBase=""></Context>

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

设置默认首页

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

// 默认首页映射 
@Controller 
public class DefaultController {@RequestMapping("/") 
    public String Welcome(){return "forward:index.html";} 
}

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计3256字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中