侧边栏壁纸
博主头像
lai博主等级

  • 累计撰写 51 篇文章
  • 累计创建 19 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

如何解决java错误不支持发行版本5

lai
lai
2022-12-13 / 0 评论 / 1 点赞 / 1,110 阅读 / 1,227 字
温馨提示:
本文最后更新于 2022-12-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

问题描述

使用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 level
  • Flie ->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.sourcemaven.compiler.target指定jdk版本,用户只需要修改工程中的java.version即可覆盖父pom中的版本,这也是为什么官方创建的demo不会出现问题的原因,这种问题通常会出现在自己构建一个新工程,而如果是导入已有工程,该问题并不常见

1

评论区