语言级别是什么呢?
"语言级别(Language Level)指的是编译器支持的 Java 语言特性。每个 Java 版本都会引入新的语言特性,例如 Java 8 引入了 Lambda 表达式和方法引用,Java 11 引入了局部变量类型推断(var)。
语言级别设置决定了你在编写代码时可以使用哪些语言特性,以及编译器如何解释这些特性。"
这个是我网页搜的一句话,我感觉意思就差不多,就比如Record(jdk16引入的),如果你要用,就算你的jdk是16,但是如果你的语言级别不是16那么也会报错
那么很理所当然的,如果你编译到的字节码目标文件(.class)是8,而你的语言级别又设置成16,那么肯定也是报错
看看下面这个例子
maven.compiler.source 设置语言级别,
maven.compiler.target 设置编译的.class的字节码版本
记得要重新加载maven项目,之后会说为啥
可以看到代码没有爆红,但是依旧是提示一样的错误,-source也是指定语言级别,因为我们编译的.class字节码文件是jdk1.8
那么我们默认最大的语言级别也就是8,所以报错是-source 8,我们maven里设置的语言级别是失效的
那么如果我不用Record这些高版本语言级别才有的呢?
依旧跟刚刚一样,语言级别是16,编译的.class字节码是1.8,但是不用Record那些1.8版本没有的东西会怎么样?
源发行版(source version):源代码所使用的Java版本。它指定了我们在编写代码时可以使用的Java语言特性和库。
目标发行版(target version):编译器将源代码编译成的Java字节码的目标版本。它决定了我们的应用程序可以运行的Java版本。
这是网上找的
我们语言级别是多少,源发行版就是多少
目标发行版就是我们编译的.class字节码的版本
所以总结就是无论如何,语言级别的版本一定要 <= 编译的.class字节码版本
刚刚说了maven里的maven.compiler.target标签可以设置编译后的.class文件的字节码版本
那么就看看新手容易爆的错,很容易想到就是你的jdk是1.8版本,而你却想编译17版本的.class字节码
相反,如果你jdk是17版本,那么你就可以编译1.8版本,11版本等等在17版本及其之下的的.class字节码
文件 -> 项目结构
报错 无效的目标发行版: 17
也就是说1.8jdk不能编译到17版本的.class字节码(目标发行版)
相反高版本jdk可以编译成低版本的.class字节码
成功编译成1.8版本的.class
IDEA的配置与Maven配置
maven里的配置和IDEA的配置 谁先谁后?
IDEA配置
IDEA里配置语言级别
文件 -> 项目结构
IDEA里配置.class字节码版本
文件 -> 设置 ->构建,执行,部署 -> 编译器 -> Java编译器
maven配置
那么问题来了到底用哪个
其实就是用的maven的
只要你重新加载了maven,你maven里设置的是什么, 就会同步到IDEA里的设置
比如你maven里的配置是你语言级别是1.8,编译的字节码是1.8 ,那么重新加载maven后你的IDEA的设置里对应的设置也都是1.8
有一点是项目的语言级别是不会覆盖的,模块的才会被覆盖,但也无所谓
其实在你手动设置IDEA对应的配置的时候,IDEA也提示你了,maven如果重新加载了,会覆盖你的配置
jre配置
jre配置位置
默认jre版本是跟jdk一样的
注意区分下jdk和jre,jre是你运行时候的环境
那么如果.class字节码版本高于jre会怎么样,明显也是会报错的
看看下面例子
.class字节码是17的
jre却是1.8的
报错“org/example/Main has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0”
61就是17版本,52就是1.8(8)版本
翻译过来就是.class文件是17的,但是jre却只可以运行1.8及以下的.class