首页 > 其他分享 >Spring Boot系列之修改内置Tomcat版本

Spring Boot系列之修改内置Tomcat版本

时间:2022-10-29 12:32:21浏览次数:50  
标签:Tomcat tomcat Spring org boot Boot spring 版本 embed


背景

在 spring boot 出来之前,或者没有使用 spring boot 时,Java EE 开发时如果选择 tomcat servlet,需要自己指定 tomcat 版本;此处没有考虑那种直接把打包的 war 直接扔到本地安装的任意版本的 tomcat,然后启动外置 tomcat 的情况。

使用 spring boot (内置 tomcat)时,一般情况下,完全没有必要去修改 tomcat 的版本,就算是生产环境使用的 spring boot 内置版本,也是最好使用 spring boot 的内置的 tomcat 版本,这是经过兼容测试、回归测试的版本号。

但是,很多公司都不推荐各个应用使用内置 tomcat 这种方式,因为这样的话,100 个服务,可能有几十种版本的 tomcat,不方便统一管理,太老的 tomcat 版本有问题,太新的版本不稳定。所以很多公司仍然在使用经过很多公司多年生产环境校验的 tomcat 7,甚至是 tomcat 6。随着版本的提升,依赖于 tomcat 的良好架构设计,其后续版本的各种性能提升,对于 http 2的支持,难道你真的舍得不去尝试使用吗?

不过,本地开发时,完全可以随意使用最新版本的 tomcat,如果是使用 spring boot,并且是使用内置 tomcat 的话,直接使用最新版本的 sb 即可,因为每次 sb 升级,都会升级 tomcat 版本。但是最新版本 sb 可能有不兼容等问题,有些人可能不会去尝试使用。

如果不是使用 spring boot 内置 tomcat,而是想使用任意版本的 tomcat 呢?

下来详细讲讲怎么修改 tomcat 的版本吧,也是去试着理解一下 tomcat 的启动过程,以及 spring boot 如何内嵌集成 tomcat 的。
想要修改内置的 tomcat 的默认版本,首先得知道当前是什么版本。

如何知道当前使用的版本

方法1:借助于IDEA

比如我当前的 sb 版本是:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
</parent>

借助于 IDE,查看 spring-boot-starter-tomcat 的 pom 文件:

<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
</dependency>
</dependencies>

可知所有的 jar。
此时如果是 eclipse 的忠实用户,则可以在当前工程 project 的 maven 依赖里面直接去看 jar 的版本号。

IDEA 则略有不同,IDEA 的 module 概念等于 eclipse 的 project 概念。IDEA 在 External Libraries下面并不能看到版本号信息,尤其是对于多个 module 的工程 project 而言,不同 module 使用不同的 tomcat 版本时如何知道当前 module 使用的是什么版本的 tomcat 呢?

Spring Boot系列之修改内置Tomcat版本_spring


实际上,此时就是要去理解 IDEA 的设计意图咯,我认为 External Libraries 的作用主要是去看源码和用于debug。在右侧还有一个面板 Maven Projects,找到当前 module,打开 dependencies 信息,然后此时还可以查看 jar 包,即 artifactId 的依赖管理关系:

Spring Boot系列之修改内置Tomcat版本_tomcat_02


可知 spring boot 1.5.7 的内置 tomcat 版本是 8.5.20。

方法2:没有IDE, 怎么知道版本信息?

打开本地maven repository目录下的spring-boot-dependencies文件:
​​​/Users/awesome-me/.m2/repository/org/springframework/boot/spring-boot-dependencies/1.5.7.RELEASE/spring-boot-dependencies-1.5.7.RELEASE.pom​​​ 可以在标签​​<properties>​​下面找到​​<tomcat.version>8.5.20</tomcat.version>​

修改内置的默认版本

从上面的方法2,就知道如何修改的思路。
即在 pom.xml 文件里面添加一个标签​​​<properties>​​​,添加期望的版本​​<tomcat.version>8.0.30</tomcat.version>​​​ 如何知道修改是否成功?
修改成​​<tomcat.version>8.0.30</tomcat.version>​​ 启动信息:

2018-03-15 00:46:26.275  INFO 47112 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2018-03-15 00:46:26.282 INFO 47112 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat
2018-03-15 00:46:26.283 INFO 47112 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.30
2018-03-15 00:46:26.333 INFO 47112 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2018-03-15 00:46:26.333 INFO 47112 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1000 ms

但是,有时候启动会报错:

Caused by: java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory 
at org.apache.catalina.util.LifecycleBase.<clinit>(LifecycleBase.java:37)
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:169)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:164)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:134)
... 13 common frames omitted

显然是缺少 jar 包,在 dependency 里面添加以下两者之一即可:

<dependency> 
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>

如果项目是使用内嵌Tomcat servlet容器形式打包部署,推荐使用下面这个,其groupId和artifactId皆是embed类型的jar包。如果项目是以war包形式打包部署,即​​pom​​​标签是​​war​​,则推荐使用上面这个。

<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-logging-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>

但是,还有一个问题:
​​​spring-boot-starter-web​​​是包含​​spring-boot-starter-tomcat​​​的,查看 pom 文件可知。
也就是说,我们没有必要重复添加​​​spring-boot-starter-tomcat​​​,一个​​spring-boot-starter-web​​就可以把一个典型的 spring web 项目搭建成功,也方便 jar 包的管理,此时需要额外添加Tomcat的GA:

<properties>
<tomcat.version>8.0.30</tomcat.version>
</properties>
<!-- 显式指定Tomcat版本 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat.version}</version>
</dependency>


标签:Tomcat,tomcat,Spring,org,boot,Boot,spring,版本,embed
From: https://blog.51cto.com/u_15851118/5806033

相关文章

  • springboot 临时关闭 springSecurity 权限认证
    Springboot项目有时候本地测试,但是有springsecurity的权限认证,很不方便测试。临时关闭方式启动类上去掉配置:@SpringBootApplication(exclude={SecurityAutoConfigur......
  • SpringMVC执行流程
      架构流程:1.用户发送请求至前端控制器DispatcherServlet.2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。3.处理器映射器根据URL找到具体的处理......
  • 2流高手速成记(之五):Springboot整合Shiro实现安全管理
    废话不多说,咱们直接接上回上一篇我们讲了如何使用Springboot框架整合Nosql,并于文章最后部分引入了服务端Session的概念而早在上上一篇中,我们则已经讲到了如何使用Springb......
  • Springboot错误:Unable to start embedded Tomcat server
    报错内容/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/bin/java-XX:TieredStopAtLevel=1-noverify-Dspring.output.ansi.enabled=always-javaagent:/......
  • Spring整合Mybatis
    spring中整合mybatis一先添加spring框架1.创建一个maven项目2.在pom.xml中添加springjar包<!--Spring--><dependency><groupId>org.springframework</groupI......
  • SpringBoot Starter缘起
    SpringBoot通过SpringBootStarter零配置自动加载第三方模块,只需要引入模块的jar包不需要任何配置就可以启用模块,遵循约定大于配置的思想。那么如何编写一个SpringBootSt......
  • 学习笔记——Tomcat(服务器)
    2022-10-28Tomcat(1)含义:Tomcat是一个使用广泛的JavaWeb服务器。(2)官方下载地址:https://tomcat.apache.org/使用8.0版本的就OK。(3)在使用Tomcat之前需要的准备工作:正......
  • SpringMVC
    SpringMVCSpringMVC简介SpringMVC概述SpringMVC是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFrameWork的后续产品,已经融合在Spr......
  • Spring JdbcTemplate
    SpringJdbcTemplateSpringJdbcTemplate基本使用JdbcTemplate概述它是spring框架中提供的一个对象,是对原始繁琐的JdbcAPI对象的简单封装。spring框架为我们提供了很多......
  • Spring整合Kafaka(二十六)
    1引入依赖<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency>2配置Kafka配置server、cons......