当前位置: 首页 > 知识库问答 >
问题:

如何在spring boot中升级spring framework版本

令狐阳秋
2023-03-14

我在maven中使用spring boot 2.3.3.RELEASE和相应的spring boot starter父代。

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.3.3.RELEASE</version>
   <relativePath/> <!-- lookup parent from repository -->
 </parent>

由于spring4shell CVE,我想将spring-Framework升级到5.2.20。RELEASE而不是已经包含的5.2.8。RELEASE。我尝试从spring-boot-依赖项中覆盖spring-framework.version属性。

    <spring-framework.version>5.2.20.RELEASE</spring-framework.version>

但它没有起作用。我还查看了spring-boot-starter-web-2.3.3.RELEASE。pom和它的spring web依赖关系硬编码为5.2.8.RELEASE。

除了将所有新版本作为依赖项添加到依赖项管理(dependencyManagement)部分之外,还有其他方法可以在spring boot中升级spring framework版本吗?谢谢

全POM:

<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
  http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.3.3.RELEASE</version>
  <relativePath/> <!-- lookup parent from repository -->
</parent>

<groupId>group</groupId>
<artifactId>app</artifactId>
<version>3.1.0-SNAPSHOT</version>
<packaging>war</packaging>

<properties>
  <flyway.version>4.1.2</flyway.version>
  <groovy.version>2.4.20</groovy.version>
  <spring-framework.version>5.2.20.RELEASE</spring-framework.version>
  <spring-cloud.version>Hoxton.SR7</spring-cloud.version>
  <h2.version>1.4.196</h2.version>
</properties>

<dependencyManagement>
<dependencies>

  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>${spring-cloud.version}</version>
    <type>pom</type>
    <scope>import</scope>
  </dependency>

</dependencies>
</dependencyManagement>

<dependencies>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-tomcat</artifactId>
  <scope>provided</scope>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>

<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
</dependency>


<dependency>
  <groupId>org.codehaus.groovy</groupId>
  <artifactId>groovy-all</artifactId>
  <version>${groovy.version}</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-xml -->
<dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
  <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

</dependencies>
<build>
<finalName>app</finalName>
<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
    <includes>
      <include>**/version.json</include>
      <include>**/**.properties</include>
    </includes>
  </resource>

  <resource>
    <directory>src/main/resources</directory>
    <filtering>false</filtering>
    <includes>
      <include>**/*.*</include>
    </includes>
    <excludes>
      <exclude>**/version.json</exclude>
      <exclude>**/**.properties</exclude>
    </excludes>
  </resource>
</resources>
</build>
</project>

编辑:这是mvn依存关系树的一部分:

+- org.springframework.boot:spring-boot-starter-webflux:jar:2.3.3.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter-json:jar:2.3.3.RELEASE:compile
[INFO] |  |  +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.11.2:compile
[INFO] |  |  \- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.11.2:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter-reactor-netty:jar:2.3.3.RELEASE:compile
[INFO] |  +- org.springframework:spring-web:jar:5.2.8.RELEASE:compile
[INFO] |  +- org.springframework:spring-webflux:jar:5.2.8.RELEASE:compile
[INFO] |  \- org.synchronoss.cloud:nio-multipart-parser:jar:1.1.0:compile
[INFO] |     \- org.synchronoss.cloud:nio-stream-storage:jar:1.1.3:compile

如果你看一下spring-boot-starter-webflux-2.3.3.RELEASE。pom包括有问题的spring web 5.2.8.RELEASE,您会发现spring版本硬编码为5.2.8.RELEASE。因此,设置Spring。maven中的framework属性将无效。

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.2.8.RELEASE</version>
      <scope>compile</scope>
    </dependency>

mvn帮助输出:有效pom:

 <dependency>
        <groupId>org.springframework</groupId>  <!-- org.springframework:spring-framework-bom:5.2.8.RELEASE, line 126 -->
        <artifactId>spring-web</artifactId>  <!-- org.springframework:spring-framework-bom:5.2.8.RELEASE, line 127 -->
        <version>5.2.8.RELEASE</version>  <!-- org.springframework:spring-framework-bom:5.2.8.RELEASE, line 128 -->
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>  <!-- org.springframework:spring-framework-bom:5.2.8.RELEASE, line 131 -->
        <artifactId>spring-webflux</artifactId>  <!-- org.springframework:spring-framework-bom:5.2.8.RELEASE, line 132 -->
        <version>5.2.8.RELEASE</version>  <!-- org.springframework:spring-framework-bom:5.2.8.RELEASE, line 133 -->
      </dependency>

@Inthai2002解决方案后编辑:我在pom.xml中另外导入了一个内部lib pom

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>internal</groupId>
                <artifactId>lib</artifactId>
                <version>4.4.0</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

        </dependencies>
    </dependencyManagement>

这个内部库直接导入了Spring Boot依赖项pom,这导致了spring框架。忽略版本属性:

          <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.3.RELEASE</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>

共有3个答案

袁高峰
2023-03-14

根据官方文件:https://docs.spring.io/spring-boot/docs/current/reference/html/dependency-versions.html#appendix.dependency-versions.properties

<spring-framework.version>5.2.20.RELEASE</spring-framework.version>

将只覆盖组ID org.springframework的版本,而不覆盖org.springframework.boot。我没有看到spring boot的version属性,因此可能必须在依赖项中包含该版本。

高山
2023-03-14

只需更改父节点如下

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.6</version>
</parent>
宋原
2023-03-14

我刚刚在一个干净的m2回购上尝试了您的pom(有和没有spring-framework.version属性)。没有这个属性,spring框架是5.2.8,有了这个属性,它是5.2.20。你能试试干净的回购吗?

版本X的spring框架bom硬编码到版本X的所有spring包中(参见https://repo1.maven.org/maven2/org/springframework/spring-framework-bom/5.2.8.RELEASE/spring-framework-bom-5.2.8.RELEASE.pom)

spring-framework.version属性被声明并用于拉取sping-boot-依赖项中的sping-framed-bom,并由其后代继承(请参阅https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-dependencies/2.3.3.RELEASE/spring-boot-dependencies-2.3.3.RELEASE.pom)。

spring boot dependencies是spring boot starter父级的父级(请参阅https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-starter-parent/2.3.3.RELEASE/spring-boot-starter-parent-2.3.3.RELEASE.pom).

因为该属性是由后代继承的,所以您可以在应用程序的pom处覆盖它的值。通过使用5.2.20覆盖它,您将spring-framed-bom 5.2.8替换为5.2.20,这有效地将大部分Spring包拉到了5.2.20

 类似资料:
  • 在这里,我在将应用程序导入android studio时面临很多问题。 需要升级gradle版本。

  • 我花了5个多小时关注google、GitHub和StackOverflow的东西。仍然无法将Android SDK版本升级到29.0.3。 在flutter doctor中,它显示了Android SDK29.0.3的未完全安装,但是当我创建一个flutter项目时,它会自动检测旧版本(28.0.3),并试图安装旧版本,而不是新版本。 这是颤振医生。颤振医生命令

  • 0.2.X

  • 从 0.8.x, 0.9.x, 0.10.0.x, 0.10.1.x, 0.10.2.x, 0.11.0.x 升级到1.0.0 Kafka 1.0.0 介绍了通信协议方面的改变。 遵循下面的滚动升级计划,可以保证您在升级过程中不用停机。 在升级之前,请先查看1.0.0版本中显著的变化。 滚动升级计划: 更新所有代理上的server.properties 并添加以下属性: CURRENT_KAFKA

  • 无非就3个原因吧 为了fix bug 为了新特性 为了爱,就是要追新 从1.a.38开始的版本,升级到最新版的成本都不大. 做到100%兼容是不现实的,但可以肯定的是, 遇到的问题的均有解决的办法. 有些兼容性问题,属于"错误"得到修正,老版本能这样写是"bug", ^_^ 这是一个汇总帖子,随时更新, 也会按版本的增长继续增长.... 请先浏览当前版本到最新版的发行注记,然后再看本列表 IE下a