SpringBoot外置Tomcat

简介: SpringBoot外置Tomcat

前言


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


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


项目配置


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


配置包管理文件


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


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


排除内置tomcat


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


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


<!--添加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为CatalinaService标签里的<Connector port="" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="" />标签,修改portredirectPort属性,代码如下:


<!--开启https访问-->
<Connector port="80" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="443"/>


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


<!--非80端口的访问跳转到443端口-->
<Connector executor="tomcatThreadPool"
           port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="443"/>


配置SSL证书


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


<!--配置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标签,代码如下:


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


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


设置默认首页


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


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


写在最后


  • 公众号无法外链,如果文中有链接,可点击下方阅读原文查看😊
相关文章
|
前端开发 Java 应用服务中间件
从零手写实现 tomcat-08-tomcat 如何与 springboot 集成?
该文是一系列关于从零开始手写实现 Apache Tomcat 的教程概述。作者希望通过亲自动手实践理解 Tomcat 的核心机制。文章讨论了 Spring Boot 如何实现直接通过 `main` 方法启动,Spring 与 Tomcat 容器的集成方式,以及两者生命周期的同步原理。文中还提出了实现 Tomcat 的启发,强调在设计启动流程时确保资源的正确加载和初始化。最后提到了一个名为 mini-cat(嗅虎)的简易 Tomcat 实现项目,开源于 [GitHub](https://github.com/houbb/minicat)。
|
2月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
433 4
|
12月前
|
监控 Java 应用服务中间件
Spring Boot整合Tomcat底层源码分析
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置和起步依赖等特性,大大简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是其与Tomcat的整合。
302 1
|
9月前
|
监控 前端开发 Java
SpringBoot集成Tomcat、DispatcherServlet
通过这些配置,您可以充分利用 Spring Boot 内置的功能,快速构建和优化您的 Web 应用。
591 21
|
存储 Java 应用服务中间件
Springboot项目打war包部署到外置tomcat容器【详解版】
该文介绍了将Spring Boot应用改为war包并在外部Tomcat中部署的步骤:1) 修改pom.xml打包方式为war;2) 排除内置Tomcat依赖;3) 创建`ServletInitializer`类继承`SpringBootServletInitializer`;4) build部分需指定`finalName`;5) 使用`mvn clean package`打包,将war包放入外部Tomcat的webapps目录,通过startup脚本启动Tomcat并访问应用。注意,应用访问路径和静态资源引用需包含war包名。
1115 0
|
27天前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
29天前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
28天前
|
JavaScript Java 关系型数据库
基于springboot的古树名木保护管理系统
本研究针对古树保护面临的严峻挑战,构建基于Java、Vue、MySQL与Spring Boot技术的信息化管理系统,实现古树资源的动态监测、数据管理与科学保护,推动生态、文化与经济可持续发展。
|
20天前
|
监控 安全 JavaScript
2025基于springboot的校车预定全流程管理系统
针对传统校车管理效率低、信息不透明等问题,本研究设计并实现了一套校车预定全流程管理系统。系统采用Spring Boot、Java、Vue和MySQL等技术,实现校车信息管理、在线预定、实时监控等功能,提升学校管理效率,保障学生出行安全,推动教育信息化发展。

热门文章

最新文章