This article is meant as an extension to Angie Jones’ “IntelliJ – Error:java: release version 5 not supported”.
Angie在她的文章中建议IntelliJ IDEA解决方案,其中显示错误消息“不支持发行版本5”。 前两个选项在IDEA中有效,但不可持续,您将在后面学习。 最后一个选项可以解决实际问题,但仅适用于基于Maven的版本。 回顾一下,基于Maven的构建的正确解决方案(另请参见Maven编译器插件)如下:
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
我想为这个问题提供一些背景知识,并建议以不同的方式解决该问题。
What is the actual problem?
为了找到适用于所有Java项目的合适解决方案,无论使用哪种构建工具,让我们深入研究实际问题。
在过去的20多年中,Java经历了几个主要版本。 每一个都引入了新版本的二进制格式,有时还引入了语言功能(例如Java 5中的枚举,Java 8中的lambda,Java 9中的模块,Java 10中的var,Java-2中的var,HTTP-2客户端Java 11…)。 但是,Java及其虚拟机高度向后兼容。 您可以使用20年的二进制文件,它们将与最新版本的Java一起运行就可以了(有例外)。
从Java源文件生成二进制文件的Java编译器支持交叉编译为各种语言级别,即以不同Java版本的格式创建这些二进制文件。 但是,有时不再支持较旧的语言级别。 从Java 9开始,编译器无法再生成Java 5二进制文件。 如果现在使用目标版本的Java 5直接或通过构建工具间接运行编译器,它将显示错误消息发行版本5不支持。
Proper Solutions
因此,您的JDK太新了,无法生成Java 5二进制文件。 有两种解决此问题的方法。
Use an older JDK
如前所述,JDK 9放弃了对交叉编译到Java 5二进制文件的支持。 这意味着,只要您使用JDK 8或更低版本,您就可以实际创建Java 5二进制文件。 但是,不建议使用此方法。 在生产运行时环境中应该没有理由坚持使用Java 5。 自2015年以来不支持JDK 5,并且不再提供安全补丁。
Change the desired target language level
您应该创建与生产环境中的Java运行时环境版本匹配的二进制文件,而不是交叉编译为Java 5二进制文件。 在2023年之前,至少应使用Java 8才能获得安全补丁。 另请参阅Wikipedia上的Java版本历史记录。 但是,我建议使用Java 11来利用介于LTS和LTS版本之间的各种新功能。
那么,如何更改目标版本呢?
Maven-based projects
出于非常好的原因,Maven仍广泛用于Java生态系统中。 但是,Maven已经很老了,一些默认设置也是如此。 其中之一是语言级别,无论您使用什么JDK,它默认为Java 1.5。
在普通的Maven项目中,您可以将上述代码粘贴到构建配置文件pom.xml中,以设置目标语言级别。
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
在Spring Boot项目中,代码略有更改为
<properties>
<java.version>1.8</java.version>
</properties>
更改pom.xml之后,您需要在IntelliJ IDEA中重新导入所有Maven项目。 最简单的方法是按cmd + shift + A(在Windows / Linux上为Shift + ctrl + A),然后直接开始输入即可。
Plain IntelliJ IDEA projects
如果您没有在IntelliJ中为Java项目选择任何构建系统,则只需确保已根据项目的JDK配置了语言级别。 您可以在项目结构设置中执行此操作。 按cmd + shift + A并开始输入内容以打开设置。 使用JDK 9+时,您需要立即更改目标级别。
- Java 9-11:目标级别Java 6Java 12+:目标级别Java 7
Conclusion
在这篇文章中,我解释了错误消息发行版5不支持的根本原因。 通过更改IntelliJ项目设置,可以在本地解决此问题。 但是,如果您想正确解决问题,则需要更改项目的构建配置文件。 否则,在下次导入IntelliJ时,您将需要再次更改它。 此外,该版本在每台计算机上的行为可能会有所不同。 CI服务器和其他未更改IntelliJ IDEA设置的服务器将继续生成Java 5二进制文件。 在构建配置文件中保留语言级别将在机器之间产生稳定且可预见的结果。