【Bugs】java: 错误: 不支持发行版本 xx

报错场景:

IDEA运行Java项目报错,点击运行之后,IDEA在编译代码的时候就出现报错:

报错类型一:java: 错误: 不支持发行版本 21

报错类型二:java: 错误: 无效的源发行版:21

详细报错如下:

Executing pre-compile tasks...
Running 'before' tasks
Checking sources
Copying resources... [spring6-ioc-annotation]
Checking dependencies… [spring6-ioc-annotation]
Dependency analysis found 0 affected files
Updating dependency information… [spring6-ioc-annotation]
Searching for compilable files... [spring6-ioc-annotation]
Parsing java… [spring6-ioc-annotation]
java: 错误: 不支持发行版本 21
Dependency analysis found 0 affected files
Errors occurred while compiling module 'spring6-ioc-annotation'
javac 17 was used to compile java sources
Finished, saving caches…
Module 'spring6-ioc-annotation' was fully rebuilt due to project configuration/dependencies changes
Compilation failed: errors: 1; warnings: 0
Executing post-compile tasks...
Compilation failed: errors: 1; warnings: 0
Synchronizing output directories...
2024/3/5 10:28 - Build completed with 1 error and 0 warnings in 4 sec, 114 ms

截图如下:
在这里插入图片描述

报错原因:

Javac编译器的版本与JDK版本不对应

解决方法:

参考以下文章:

IDEA切换JDK版本详细步骤

保持文章里面4大点的版本一直即可:

  • ①File——>Project Structure——>Project;
  • ②File——>Project Structure——>Modules;
  • ③File——>Project Structure——>SDKs;
  • ④File——>Settings——>Build, Execution, Deployment——>Compiler——>Java Compiler。

例如,我这里是第四点的版本不一致:
在这里插入图片描述

<think>好的,我现在需要解决Spring Boot项目编译时出现的Java版本不匹配问题。用户提到错误javac的21版本,但源代码和目标版本是17,导致不匹配。首先,我应该回忆一下Java项目中的版本配置通常在哪里设置。 在Maven项目中,Java版本通常在pom.xml文件中通过maven-compiler-plugin插件来配置。可能用户的项目里设置的源版本和目标版本是17,但实际使用的JDK是21,导致编译器版本与配置不一致。这时候需要检查pom.xml里的配置是否正确。 另外,Spring Boot项目可能有父POM,里面可能已经预定义了编译器版本。如果用户没有显式覆盖,可能会继承父POM的设置。比如,Spring Boot 3.x默认可能需要Java 17,如果用户的项目原本是基于旧版本,或者配置被覆盖了,可能会出现版本不匹配。 接下来,我应该考虑不同的构建工具,比如Maven和Gradle,它们的配置方式不同。用户的问题中没有明确说明,但可能需要分别解释两种情况。 对于Maven,需要确认<properties>中的<java.version>属性是否为17,并且<maven-compiler-plugin>的<source>和<target>是否正确设置。同时,检查环境变量中的JAVA_HOME是否指向JDK 17,或者是否在IDE中设置了正确的JDK版本。 对于Gradle,应该在build.gradle文件中设置sourceCompatibility和targetCompatibility为17,并且确保使用的Gradle JVM配置正确。 另外,用户可能同时安装了多个JDK版本,但编译时使用了错误的版本。需要指导他们如何检查当前使用的JDK版本,如何切换,例如在命令行中使用mvn -v查看Maven使用的JDK,或者在IDE中设置项目SDK。 可能还需要检查IDE的设置,比如IntelliJ或Eclipse中的项目结构配置,确保模块的Language level和编译器版本与pom.xml或build.gradle中的一致。 总结下来,解决方案的步骤可能包括: 1. 检查构建配置文件中的Java版本设置。 2. 确保本地安装的JDK版本与配置一致。 3. 清理并重新构建项目。 4. 验证IDE中的相关配置。 此外,可能需要提到如何显式指定编译器版本,例如在Maven命令中使用-D参数,或者在Gradle中通过任务参数设置。 现在需要将这些思路整理成结构化的回答,分步骤说明,确保用户能逐步排查和解决问题。同时,生成相关问题,帮助用户深入理解可能遇到的类似问题。</think>### 解决Spring Boot项目Java版本不匹配问题 当出现`javac: 21 source release 17 target release mismatch`错误时,说明项目配置的Java版本(17)与编译器实际使用的JDK版本(21)不一致。以下是分步解决方案: --- #### 1. **检查构建工具配置文件** **Maven项目** 在`pom.xml`中确认以下配置: ```xml <properties> <java.version>17</java.version> <!-- 确保此处为17 --> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> </plugins> </build> ``` **Gradle项目** 在`build.gradle`中检查: ```groovy java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } ``` --- #### 2. **验证本地JDK版本** - **命令行检查** ```bash java -version # 输出应为JDK 17 mvn -v # 查看Maven使用的JDK版本 ``` - **环境变量配置** 确保`JAVA_HOME`指向JDK 17的安装路径(如`/usr/lib/jvm/jdk-17`)。 --- #### 3. **IDE配置修正(以IntelliJ为例)** 1. **项目结构设置** `File > Project Structure > Project`: - **SDK**: 选择JDK 17 - **Language Level**: 设置为17 2. **编译器设置** `Settings > Build, Execution, Deployment > Compiler > Java Compiler`: - 模块的Target bytecode version设为17 --- #### 4. **清理并重新构建项目** ```bash # Maven mvn clean install -DskipTests # Gradle ./gradlew clean build ``` --- #### 5. **显式指定编译器版本(可选)** 在Maven命令中直接指定版本: ```bash mvn compiler:compile -Dmaven.compiler.source=17 -Dmaven.compiler.target=17 ``` --- ### 常见原因与原理 - **Spring Boot父POM继承**:Spring Boot 3.x默认要求Java 17[^1],若项目继承自父POM且未显式配置版本,可能导致版本冲突。 - **多JDK环境干扰**:系统安装了多个JDK版本,但未正确配置默认版本。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值