在 IDEA 做 maven 项目时总会遇到错误:java: 错误: 不支持发行版本 5,这是因为 IDEA 的 java 编译器默认版本太低了,有两种方法可以更正。
第 1 种方法
在 pom.xml 中引入指定 maven-compiler-plugin 的版本,此项设置会同时影响 LanguageLevel 和 Java Compiler ,在修改之后会默认使用此处的版本:
第 2 种方法
idea不支持发行版本5
打开设置
打开 Java Compiler
此处选择高于 10 的版本即可。
但是第一种办法在再次修改 pom.xml 时,它还是会自动变更为 1.5 版本。
自动变更为 1.5 版本的原因是,maven 按照默认配置运行时,java 工程使用的默认 jdk 版本是 1.5,并不是我们熟悉和常用的版本。修改配置的方式是,将下面的 profile 标签整个复制到 settings.xml 中的 profiles 标签内。参考设置如下:
第 3 种方法(?未确定是否可行)
直接在 pom.xml 的 project 标签下添加:
廖雪峰 – Java 教程 – 面向对象编程 – 面向对象基础 – class 版本
class 版本 – 最后更新: 2022/4/21 18:29
在 Java 开发中,许多童鞋经常被各种版本的 JDK 搞得晕头转向,本节我们就来详细讲解 Java 程序编译后的 class 文件版本问题。
我们通常说的 Java 8 ,Java 11 ,Java 17 ,是指 JDK 的版本,也就是 JVM 的版本,更确切地说,就是 java.exe 这个程序的版本:
而每个版本的 JVM ,它能执行的 class 文件版本也不同。例如,Java 11 对应的 class 文件版本是 55 ,而 Java 17 对应的 class 文件版本是 61 。
如果用 Java 11 编译一个 Java 程序,输出的 class 文件版本默认就是 55 ,这个 class 既可以在 Java 11 上运行,也可以在 Java 17 上运行,因为 Java 17 支持的 class 文件版本是 61 ,表示“最多支持到版本61”。
如果用 Java 17 编译一个 Java 程序,输出的 class 文件版本默认就是 61 ,它可以在 Java 17、Java 18 上运行,但不可能在 Java 11 上运行,因为 Java 11 支持的 class 版本最多到 55 。如果使用低于 Java 17 的 JVM 运行,会得到一个 UnsupportedClassVersionError ,错误信息类似:
只要看到 UnsupportedClassVersionError 就表示当前要加载的 class 文件版本超过了 JVM 的能力,必须使用更高版本的 JVM 才能运行。
打个比方,用 Word 2013 保存一个 Word 文件,这个文件也可以在 Word 2016 上打开。但反过来,用 Word 2016 保存一个 Word 文件,就无法使用 Word 2013 打开。
但是,且慢,用 Word 2016 也可以保存一个格式为 Word 2013 的文件,这样保存的 Word 文件就可以用低版本的 Word 2013 打开,但前提是保存时必须明确指定文件格式兼容 Word 2013 。
类似的,对应到 JVM 的 class 文件,我们也可以用 Java 17 编译一个 Java 程序,指定输出的 class 版本要兼容 Java 11(即 class 版本 55 ),这样编译生成的 class 文件就可以在 Java >=11 的环境中运行。
指定编译输出有两种方式,一种是在 javac 命令行中用参数 –release 设置:
参数 –release 11 表示源码兼容 Java 11 ,编译的 class 输出版本为 Java 11 兼容,即 class 版本 55 。
第二种方式是用参数 –source 指定源码版本,用参数 –target 指定输出 class 版本:
上述命令如果使用 Java 17 的 JDK 编译,它会把源码视为 Java 9 兼容版本,并输出 class 为 Java 11 兼容版本。注意 –release 参数和 –source –target 参数只能二选一,不能同时设置。
然而,指定版本如果低于当前的 JDK 版本,会有一些潜在的问题。例如,我们用 Java 17 编译 Hello.java ,参数设置 –source 9 和 –target 11 :
用低于 Java 11 的 JVM 运行 Hello 会得到一个 LinkageError ,因为无法加载 Hello.class 文件,而用 Java 11 运行 Hello 会得到一个 NoSuchMethodError ,因为 String.indent() 方法是从 Java 12 才添加进来的,Java 11 的 String 版本根本没有 indent() 方法。
注:如果使用 –release 11 则会在编译时检查该方法是否在 Java 11 中存在。
因此,如果运行时的 JVM 版本是 Java 11 ,则编译时也最好使用 Java 11 ,而不是用高版本的 JDK 编译输出低版本的 class 。
如果使用 javac 编译时不指定任何版本参数,那么相当于使用 –release 当前版本编译,即源码版本和输出版本均为当前版本。
源码版本
在编写源代码的时候,我们通常会预设一个源码的版本。在编译的时候,如果用 –source 或 –release 指定源码版本,则使用指定的源码版本检查语法。
例如,使用了 lambda 表达式的源码版本至少要为 8 才能编译,使用了 var 关键字的源码版本至少要为 10 才能编译,使用 switch 表达式的源码版本至少要为 12 才能编译,且 12 和 13 版本需要启用 –enable-preview 参数。
小结
高版本的 JDK 可编译输出低版本兼容的 class 文件,但需注意,低版本的 JDK 可能不存在高版本 JDK 添加的类和方法,导致运行时报错。
运行时使用哪个 JDK 版本,编译时就尽量使用同一版本编译源码。
今天的文章
idea不支持发行版本5分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/131366.html