springboot2.7.16到3.5.16,srpingcloud2021.0.1->2025.0.3,jdk1.8->17,升级记录一(从踩屎坑到上岸的辛酸历程)

📅 2026/7/14 6:39:44 👁️ 阅读次数 📝 编程学习
springboot2.7.16到3.5.16,srpingcloud2021.0.1->2025.0.3,jdk1.8->17,升级记录一(从踩屎坑到上岸的辛酸历程)

1、修改对应的maven版本号

2、报错:'dependencies.dependency.version' for org.apache.httpcomponents:httpclient:jar is missing.

原因:没有明确指定版本

将 Spring Boot 从 2.7.x 升级到 3.x 版本,一个关键变化是Spring Framework 6 移除了对 Apache HttpClient 4 的支持,全面转向了 HttpClient 5。因此,原来的org.apache.httpcomponents:httpclienthttpmime依赖(属于 HttpClient 4)需要被替换为 HttpClient 5 的依赖。(在 Spring Boot 项目中,建议优先通过导入spring-boot-dependenciesBOM 来统一管理所有 Spring 及关联依赖的版本。如果 BOM 中已定义了httpclient5的版本,则可以省略<version>标签。)

3、'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: com.fasterxml.jackson.core:jackson-databind:jar -> duplicate declaration of version ${version.jackson.core} @ com.xmair:mfehome:1.0.0, D:\work\sourceCode\serviceCode\mfehome4.0-jdk17\pom.xml, line 178, column 15

原因:这个错误表明你的 Maven POM 文件中jackson-databind依赖被重复声明了,并且在重复声明的地方,其版本号使用了属性占位符${version.jackson.core}

解决:移除多余的引用

4、maven clean的时候报错:[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project common: Fatal error compiling: 无效的标记: --release -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException [ERROR] [ERROR] After correcting the problems, you can resume the build with the command [ERROR] mvn <args> -rf :common

原因:这个错误表明Maven 编译器插件无法识别--release参数,通常是因为JDK 版本过低maven-compiler-plugin版本不兼容

4、报错:class lombok.javac.apt.LombokProcessor (in unnamed module @0x39e75e88) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing to unnamed module @0x39e75e88

原因:Lombok 与 JDK 版本不兼容导致的。

解决方案:升级 Lombok 版本

5、报错:

原因:由于2修改了HttpClient 5,所以需要修改包路径

主要改动点

  1. 包名变更org.apache.httporg.apache.hc.core5/org.apache.hc.client5.http

  2. API 变化NameValuePairCookieRequestConfig等类的包路径和构造方式都有变化

  3. 内部类问题HttpEntityEnclosingRequestBase在 HttpClient 5 中已移除,需改用其他方式

6、程序包org.apache.commons.codec.binary不存在

引入

<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.19.0</version>
</dependency>

7、程序包javax.servlet.http不存在

修改为jakarta.servlet.http

8、import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder; 提示找不到符号

原因:JDK 9+ 移除了sun.misc.BASE64Encodersun.misc.BASE64Decoder,这些是 JDK 内部 API,在 JDK 9 之后被标记为不推荐使用并最终移除。

使用Base64.getEncoder()、 Base64.getDecoder()替代

9、MsgStruct.java:[27,31] No property named "msgId" exists in source parameter(s). Did you mean "messageUrl"?

@Override
@Mappings({
@Mapping(source = "msgId", target = "pkid"),
})
MsgDto toDto(MfImappstatusDto entity);

MfImappstatusDto extends MfImappstatus MfImappstatusDto中没有msgId,但是MfImappstatus中有这个字段

问题原因

MapStruct 在编译时只会扫描MfImappstatusDto自身声明的属性,不会自动识别父类MfImappstatus中的字段。虽然运行时子类可以访问父类的字段,但 MapStruct 的编译期检查无法看到继承的字段。

10、报错:

@Override @Mappings({ @Mapping(source = "appPkid", target = "mfAppPkid"), @Mapping(source = "helpInfoName", target = "helpinfoName"), @Mapping(source = "helpInfoUrl", target = "helpinfoUrl"), @Mapping(source = "helpInfoTypePkid", target = "mfHelpinfoTypePkid"), }) MfHelpinfo toEntity(HelpInfoDto dto); Unknown property "mfAppPkid" in result type MfHelpinfo. Did you mean "null"?

MfHelpinfo 有mfAppPkid,只是MfHelpinfo 用@Data

常见原因

1. Lombok 版本与 MapStruct 版本不兼容

@Data生成的 getter/setter 需要 MapStruct 能够识别。如果版本不兼容,MapStruct 无法识别这些方法。

解决方案:升级 Lombok 和 MapStruct 版本

<properties> <!-- 确保使用兼容的版本 --> <lombok.version>1.18.32</lombok.version> <org.mapstruct.version>1.6.3</org.mapstruct.version> </properties> <dependencies> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> <!-- MapStruct --> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${org.mapstruct.version}</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>17</source> <target>17</target> <annotationProcessorPaths> <!-- Lombok 必须在 MapStruct 前面 --> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </path> <!-- MapStruct --> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version> </path> <!-- Lombok + MapStruct 绑定 --> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>0.2.0</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build>