问题描述
使用spring-boot3.0.0 构建项目,在项目启动时候idea报错,java: 错误: 不支持发行版本 5
原因分析
出现问题的根本原因是maven工程项目使用JDK版本过低,而Spring Boot3.0.0需要jdk17+,创建maven工程的时候直接使用了idea提供的mave原型创建的项目,工程项目中默认使用了jdk5导致了项目启动时候报错
这时候我们打开Flie
-> Settings
-> Build,Execution,Deployment
-> Compiler
-> Java Compiler
会看到bytecode version
相关信息为5
同时Flie
->Project Structure
-> Project Settings
-> Project
的SDK和Language level 可能会是5
,这个与之前是否已修改过有关
而Modules
下Language level 是5
解决方法
修改idea工程配置(不推荐)
只需要将idea上述对应配置改成相应版本即可,但是maven工程再次编译后会默认恢复,不能做到持续性修改
Flie
->Settings
->Build,Execution,Deployment
->Compiler
->Java Compiler
修改bytecode version
Flie
->Project Structure
->Project Settings
->Project
修改的SDK和Language levelFlie
->Project Structure
->Project Settings
->Modules
修改Language level
通过pom.xml管理
方法一:指定maven-compiler-plugin中的jdk版本
<build>
<plugins>
<!-- 设置编译版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
方法二:给properties添加maven.compiler.target和maven.compiler.source
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
修改maven配置
通过修改maven的setting.xml
文件,统一指定maven工程构建时候的jdk版本
<profile>
<id>jdk-17</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>17</jdk>
</activation>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
</properties>
</profile>
举一反三
为什么通过官网start.spring.io创建的maven项目不会存在这个问题呢?
通过查看默认pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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 https://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>3.0.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置文件中指定了jdk版本
<properties>
<java.version>17</java.version>
</properties>
java.version
属性在spring-boot-starter-parent
中的pom.xml
被引用
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.0.0</version>
</parent>
<artifactId>spring-boot-starter-parent</artifactId>
<packaging>pom</packaging>
<name>spring-boot-starter-parent</name>
<description>Parent pom providing dependency and plugin management for applications built with Maven</description>
<properties>
<java.version>17</java.version>
<resource.delimiter>@</resource.delimiter>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<!--省略其他配置-->
</project>
也就是demo
工程是通过maven.compiler.source
和maven.compiler.target
指定jdk版本,用户只需要修改工程中的java.version
即可覆盖父pom中的版本,这也是为什么官方创建的demo不会出现问题的原因,这种问题通常会出现在自己构建一个新工程,而如果是导入已有工程,该问题并不常见
评论区