【问题标题】:Change the version of the embedded tomcat using spring starter使用spring starter更改嵌入式tomcat的版本
【发布时间】:2020-11-16 11:51:03
【问题描述】:

要求使用 spring boot 版本 2.2.6.RELEASE 但是 tomcat 版本应该是 9.0.37。

我尝试通过从 spring-boot-starter-web 依赖项中排除 tomcat 启动器来做到这一点:

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${spring-boot.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

并单独添加spring-boot-starter-tomcat 9.0.37 tomcat 版本:

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <version>2.3.2.RELEASE</version>
        </dependency>

但是,即使这样做,版本也不会被覆盖,并且会使用以下内容:

Mar 11 2020 09:31:38 UTC
Apache Tomcat/9.0.33
9.0.33.0

我们是否需要做任何其他事情来覆盖 tomcat 版本? 是否可以通过排除started来覆盖它?

更新: 父 pom 是企业父 pom,而不是 spring-boot-starter-parent。根据其中一个答案,我们可以简单地覆盖 tomcat.version 属性,但是我的有效 pom 没有显示它。

【问题讨论】:

  • 不要。永远不要混合不同版本的框架的模块,这会导致问题。只需按照参考指南here 中的说明更改版本,以获取要覆盖的版本属性列表,请参阅this appendix
  • 太好了,我认为这就是这样做的方法。今天就试试看!
  • 它只是不工作 :-( 在某处是否有一个示例应用程序演示?

标签: java spring spring-boot tomcat


【解决方案1】:

如果您不是从 spring-boot-starter-parent 继承,我只能猜测您在某个依赖项管理中导入了 spring-boot-dependencies

documentation covers 覆盖 tomcat 版本需要做什么。在导入 spring-boot-dependencies 之前,每个 tomcat 工件都应与覆盖的版本一起列出。工件列表可在spring-boot-dependencies 中找到。

使用不同版本的启动器是错误的(你不能在同一个应用程序中混合两个 Spring Boot 版本)并且不会产生任何影响,因为依赖管理无论如何都在控制之中。换句话说,您确实会得到spring-boot-starter-web 版本2.3.2.RELEASE,但它带来的所有工件都将由依赖管理(由版本2.2.6.RELEASE 定义的tomcat 版本)管理。

在您的特定情况下,升级到2.2.9.RELEASE 也可能是一种选择,因为它为您需要的 tomcat 版本提供依赖管理。

【讨论】:

  • 感谢您的解释。现在我明白了。
  • 只有一件事,我在依赖项管理标签中添加了所有必需的 tomcat 依赖项,并且它起作用了。只是在spring boot依赖项之前或之后添加它并不重要,在这两种情况下我都可以覆盖tomcat版本。但是文档指出它应该在 spring boot 依赖项标记之前。为什么我们必须在标签之前添加它或者我错过了什么?
【解决方案2】:

嗯,这已经回答了。

对你来说,当你使用 maven 时,你需要覆盖 在父 Spring pom 中设置的属性。

<properties>
  ......
<tomcat.version>your_version</tomcat.version>
  ......
<properties>

对于gradle,很简单

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

在你的主 bu​​ild.gradle 中

来源:How to change embedded tomcat's version in existing spring boot app?

【讨论】:

  • 有效的 pom 没有任何属性,即 tomcat.version 并且简单地覆盖它对我不起作用。可能它在旧版本的 spring boot 中可用,即在 boot 2 之前。
  • 似乎还是一样 - stackoverflow.com/questions/62826247/… 但我大部分都使用 Gradle,所以帮不上什么忙
  • 哦,当我手动遍历 pom 并检查 spring-boot-dependencies pom 然后我可以看到该属性。但它没有出现在有效的pom中。我们有一个公司范围的父 pom 作为我们的父 pom 而不是 spring parent 作为父(作为依赖项存在)这有什么不同吗?我虽然它结合了所有 pom 的属性。
  • 我建议该公司的母公司将母公司添加到spring-boot-starter-parent。然后您可以编辑版本 - 这可能就是它不适合您的原因。
  • 你的意思是公司的poms parent应该改为spring-boot-starter-parent?
猜你喜欢
  • 2020-10-22
  • 2018-08-17
  • 2021-07-08
  • 2016-12-28
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
相关资源
最近更新 更多