如何更改现有 Spring Boot 应用程序中的嵌入式 tomcat 版本?

Posted

技术标签:

【中文标题】如何更改现有 Spring Boot 应用程序中的嵌入式 tomcat 版本?【英文标题】:How to change embedded tomcat's version in existing spring boot app? 【发布时间】:2018-08-17 22:31:52 【问题描述】:

我目前正在运行带有嵌入式 tomcat 的 spring-boot version 1.4.0.RELEASE 应用程序。包含的Tomcat版本是8.5.4

需要将 tomcat 版本更新为9.x。当我查看 mvnrepository here 时,我发现 tomcat 版本 9.0.5 有可用更新(如下图所示)

如果我的pom.xml中没有办法直接提及这个版本,我应该如何在我的项目中使用这个版本?

我不想走传统的部署路线(外部 tomcat 上的 WAR 工件)。

【问题讨论】:

我怀疑它会起作用,tomcat 中有一些内部变化没有反映在 Spring Boot 1.4 的代码中。 好的。但是有没有办法改变那个版本呢?我准备将spring-boot 版本升级到2.0.0.RELEASE 但是有tomcat 版本8.5.28 只需指定您要使用的版本(假设您使用spring-boot-starter-parent 作为项目的父级。 【参考方案1】:

我认识的聚会迟到了,正在寻找类似的问题,我想我会分享一个更字面的提示。

您需要覆盖 在 spring 的父 pom 中设置的属性(这是强制性的)以适合您的情况(以及兼容性):

<properties>
......
    <tomcat.version>9.0.5</tomcat.version>
......
<properties>

这是根据 [Introduction to Spring][1] 的。他们的示例显示了许多其他精心挑选的依赖项。 [1]:http://www.springboottutorial.com/spring-boot-starter-parent

【讨论】:

【参考方案2】:

如果您使用的是spring boot gradle插件和spring boot starters..您可以通过在build.gradle中设置maven项目属性来自定义版本。

ext['tomcat.version'] = '9.0.45'

对于行家

<properties>
    <tomcat.version>9.0.45</tomcat.version>
<properties>

可以在spring-boot-dependencies中找到所有可以自定义的外部依赖

【讨论】:

太糟糕了,你不能给出完整的例子来说明如何做到这一点。这是部分答案 使用 gradle 可以做到 def tomcatVersion = '9.0.30'dependencies implementation "org.apache.tomcat.embed:tomcat-embed-core:$tomcatVersion" implementation "org.apache.tomcat.embed:tomcat-embed-el:$tomcatVersion" implementation "org.apache.tomcat.embed:tomcat-embed-websocket:$tomcatVersion" implementation "org.apache.tomcat:tomcat-annotations-api:$tomcatVersion" 如果使用 maven,请在 &lt;dependencyManagement&gt; 中添加依赖项,否则项目可能根本不会更改它。 我不会以 Tomcat 10 为例,因为它是 jakartified 并且当前的 Spring 库无法使用它。【参考方案3】:

对于 Maven 项目

<properties>
  ...
  <tomcat.version>8.0.53</tomcat.version>
</properties>

<dependencyManagement>
        <dependencies>
         <!-- NON-INFORMATIVE -->
         <!--   <dependency>
                <groupId>io.spring.platform</groupId>
                <artifactId>platform-bom</artifactId>
                <version>$bom.version</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>$spring-cloud.version</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>   -->
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-core</artifactId>
                <version>$tomcat.version</version>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-el</artifactId>
                <version>$tomcat.version</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

【讨论】:

以上是关于如何更改现有 Spring Boot 应用程序中的嵌入式 tomcat 版本?的主要内容,如果未能解决你的问题,请参考以下文章

将 liquibase 添加到现有 Spring Boot 项目的正确方法

Spring Boot 应用程序“bean 类的 bean 名称与现有冲突” - 如何从 3rd 方库/依赖项中排除包/类?

Spring Boot 中的 I18n + Thymeleaf

Spring Boot 中的动态数据库属性更改

如何在 Spring Boot 中更改允许的标头

如何在运行时更改日志级别而不重新启动 Spring Boot 应用程序