IntelliJ IDEA中的语言级别版本与目的字节码版本配置

打印 上一主题 下一主题

主题 806|帖子 806|积分 2418

一、IntelliJ IDEA 中的三个重要设置

1. Project Structure -> Project language level




  • 位置
    File -> Project Structure -> Project
    内里有一个 Project language level 下拉列表。
  • 作用

    • 控制整个 项目 默认的 语言级别(Language Level)
    • 这是 IDE 对源代码的语法支持提示警告 所基于的版本。例如,如果选择 Java 17,IDE 就会启用 Java 17 的语法解析,包括 record、sealed 等语法提示。

  • 特性

    • 这是整个项目的“默认语言级别”。所有模块如果“继承项目默认”,就会拿这个级别当做编译时语法支持的上限。
    • 它并不一定影响终极天生的 .class 文件版本,仅仅是一个 编辑器层设置,告诉 IDE “我可以用到 Java X 的语法特性”。
    • 如果现实编译器(或 Maven、Gradle)无法识别该版本,新语法编译可能会失败


2. Project Structure -> Modules -> Language level




  • 位置
    File -> Project Structure -> Modules
    可以分别为 每个 Module 选择语言级别。如果选择 “项目默认(Project default)”,就会继承 Project language level。
  • 作用

    • 与 Project language level 原理雷同,只是粒度更细差异模块可以拥有差异语言级别
    • 依然属于 IDE 编辑器举动(语法提示、高亮检查)。

  • 场景示例

    • 某些大型多模块项目,其中一个模块用的是 Java 17 新特性(如 record),另一个模块为了兼容性只能使用 Java 8。就必要在 Modules 层面分别指定。

  • 同样注意:这仍旧不决定编译输出的字节码版本,只是IDE“看到”源代码时遵循哪个 Java 尺度来进行语法解析与提示。

3. Settings -> Build, Execution, Deployment -> Compiler -> Java Compiler (字节码版本)




  • 位置
    File -> Settings -> Build, Execution, Deployment -> Compiler -> Java Compiler
    这里会看到一个 “Per-module bytecode version” 或者一个**全局字节码版本(Target bytecode version)**配置。
  • 作用

    • 真正决定编译器 输出的 .class 文件版本
    • 相当于执行 javac -target <version> 或 javac --release <version> 时所选的目的版本。

  • 为什么它“优先”?

    • 当使用 IntelliJ 自带的 内部编译器(而不是 Maven/Gradle 命令行)进行编译时,IDE 会根据这里的设置来天生字节码。如果它与 Maven 的 <maven.compiler.target> 差异,就会产生辩论或覆盖。

  • 必要手动选择

    • 如果这里的字节码版本与 Module language level 不匹配,就可能出现编译报错,比如 invalid source release: xx 或 warning: source release xx requires target release xx or later。
    • 有些时候如果你设成 “Same as language level”,IDEA 可能会“猜错”或者用旧的缓存,必要手动指定为 具体版本(例如 17、11、1.8)才更稳固。


二、与 Maven 中 <maven.compiler.source> 和 <maven.compiler.target> 的辩论

在 Maven 项目中,<maven.compiler.source><maven.compiler.target> 同样决定编译器要处理的源代码版本与天生的目的字节码版本。例如:
  1. [/code]
  2. [list]
  3. [*][b]maven.compiler.source[/b]:指定 -source 版本,告诉 javac 代码语法遵循 Java 8。
  4. [*][b]maven.compiler.target[/b]:指定 -target 版本,告诉 javac 天生 Java 8 格式的字节码。
  5. [/list] 如果与 IntelliJ “Java Compiler” 设置辩论,往往会出现:
  6. [list]
  7. [*][b]IDEA 内部编译[/b]时:IDEA 的 Compiler 设置可能覆盖 Maven 配置。
  8. [*][b]用 Maven 命令行编译[/b]时:Maven 的 <maven.compiler.target> 会生效,IDEA 的设置就不一定有用。
  9. [/list] [hr] [size=5]三、常见报错与警告[/size]
  10.    在 IntelliJ IDEA 中:
  11.   
  12. [list]
  13. [*][b]-source(源代码版本)[/b]:对应 [b]Project Language Level[/b],定义了项目的 [b]语法级别[/b]。
  14. [*][b]-target(目的字节码版本)[/b]:对应 [b]Java Compiler 中的 Target bytecode version[/b],定义了编译输出的 .class 文件版本。
  15. [/list]  并且 [b]IDEA 的设置优先级高于 Maven 的配置[/b],除非选择 [b]Delegate IDE build/run to Maven[/b],将构建和编译完全交由 Maven 控制。
  16.   [hr] [size=4]1. [b]警告: 源发行版 XX 必要目的发行版 XX 或更高[/b][/size]
  17. [b]错误原因[/b]
  18. 这种警告的核心问题是 -source 版本比 -target 版本高。
  19. [b]示例[/b]:
  20. [list]
  21. [*][b]Project Language Level[/b] 设置为 Java 17(-source 17),但 [b]Java Compiler 的 Target bytecode version[/b] 设置为 Java 11(-target 11)。
  22. [*]意思是你使用了 [b]Java 17 的语法[/b] 特性,但尝试将代码编译成 [b]Java 11 的字节码[/b],导致版本不兼容。
  23. [/list] [b]配置位置[/b]
  24. [b]IDEA 设置[/b]:
  25. [list]
  26. [*][b]Project Language Level[/b](-source):
  27. 位置:File -> Project Structure -> Project -> Project language level。
  28. [b]示例[/b]:设置为 Java 17。
  29. [*][b]Java Compiler Target bytecode version[/b](-target):
  30. 位置:File -> Settings -> Build, Execution, Deployment -> Compiler -> Java Compiler -> Target bytecode version。
  31. [b]示例[/b]:设置为 Java 17(与 Project Language Level 保持划一)。
  32. [/list] [b]Maven 设置[/b](若使用 Maven): 在 pom.xml 中配置 maven-compiler-plugin:
  33. [code]<plugin>
  34.     <groupId>org.apache.maven.plugins</groupId>
  35.     <artifactId>maven-compiler-plugin</artifactId>
  36.     <version>3.8.1</version>
  37.     <configuration>
  38.         <source>17</source>
  39.         <target>17</target>
  40.     </configuration>
  41. </plugin>
复制代码
解决方法


  • 保证 Project Language LevelTarget bytecode version 划一。
  • 在 Maven 中设置 <source> 和 <target> 为雷同版本。
  • 如果 IDEA 与 Maven 辩论,勾选 Delegate IDE build/run to Maven

    • 位置:File -> Settings -> Build, Execution, Deployment -> Build Tools -> Maven。


2. 无效的目的发行版: XX (invalid target release)

错误原因
-target 版本不受当前 JDK 支持

示例


  • 使用 Java 11 JDK 编译项目,但将 Target bytecode version 设置为 Java 17(-target 17)。
  • Java 11 编译器无法天生 Java 17 的字节码,导致报错。
配置位置
IDEA 设置


  • Project SDK
    位置:File -> Project Structure -> Project SDK。
    确保选择支持高版本的 JDK
  • Java Compiler Target bytecode version
    位置:File -> Settings -> Build, Execution, Deployment -> Compiler -> Java Compiler。
    示例:确保 Target 设置为当前 JDK 支持的版本,例如 JDK 11 支持 Target 11。
Maven 设置(若使用 Maven): 在 pom.xml 中设置与 JDK 划一的 <source> 和 <target>:
  1. <configuration>
  2.     <source>11</source>
  3.     <target>11</target>
  4. </configuration>
复制代码
解决方法


  • 将项目的 Project SDK 升级到支持目的字节码版本的 JDK。
  • Java Compiler 中的 Target bytecode version 设置为当前 JDK 支持的版本。
  • Maven 中的 <target> 也要与 JDK 划一。

3. 无效的源发行版: XX (invalid source release)

错误原因
-source 版本不受当前 JDK 支持

示例


  • 使用 Java 8 JDK,但将 Project Language Level 设置为 Java 17(-source 17)。
  • Java 8 编译器无法解析 Java 17 的语法,导致报错。
配置位置
IDEA 设置


  • Project SDK
    位置:File -> Project Structure -> Project SDK。
    示例:将 JDK 设置为与 -source 对应的版本,如 Java 17。
  • Project Language Level
    位置:File -> Project Structure -> Project -> Project language level。
    示例:确保设置为当前 JDK 支持的版本。
Maven 设置: 在 pom.xml 中修改 <source>:
  1. <configuration>
  2.     <source>8</source>
  3.     <target>8</target>
  4. </configuration>
复制代码
解决方法


  • Project SDK 升级到支持源代码版本的 JDK。
  • Project Language Level 中选择当前 JDK 支持的语法版本。
  • Maven 中的 <source> 和 <target> 也要设置为当前 JDK 兼容的版本。

总结:IDEA 与 Maven 配置对比

配置内容IDEA 配置位置Maven 配置位置-sourceFile -> Project Structure -> Project -> Project language level<source> in maven-compiler-plugin-targetFile -> Settings -> Compiler -> Java Compiler -> Target bytecode version<target> in maven-compiler-pluginJDK 版本File -> Project Structure -> Project SDKMaven 使用当前系统 JDK 版本
四、三种设置的本质区别优先级



  • Language Level (Project / Module)

    • IDE 编辑器 层面的语法识别、提示、自动完成。
    • 它只告诉 IntelliJ,“你写的代码最高用到哪个Java语法特性”。
    • 并不必然决定终极编译的字节码版本;若编译器或 Maven 目的设置更低,依旧会在编译时失败。

  • Compiler -> Java Compiler -> “字节码版本”

    • IDEA 内部编译器 的真实目的字节码版本(与 javac -target 相当)。
    • 这个设置在 IDE 内部编译时“优先”
    • 如果不匹配 Maven 的 <maven.compiler.target>,会辩论或被覆盖。

  • Maven 中 <maven.compiler.source> / <maven.compiler.target>

    • 命令行 Maven 编译时的官方配置。
    • 如果使用 IDEA 内置 Maven 插件,一般也能同步到 IDEA 的编译过程,但有时必要手动选择“Delegate IDE build/run actions to Maven/Gradle”才能完全由 Maven/Gradle 编译。

   终极照旧要“对齐”所有配置
  

  • Project language level = Module language level = Maven source/target = IntelliJ Compiler bytecode version。
  • 才能制止出现版本辩论的错误或警告。
  
 五、如何精确设置让一切“对齐”

1.在 pom.xml 中
  1. <properties>
  2.     <maven.compiler.source>17</maven.compiler.source>
  3.     <maven.compiler.target>17</maven.compiler.target>
  4.     <maven.compiler.release>17</maven.compiler.release>
  5. </properties>
复制代码


  • 添加 maven.compiler.release(如果使用新版本 Maven 插件),比 source/target 更简洁、安全。
2.在 IntelliJ Project Structure


  • Project language level 设置成 17Modules(如果不特殊需求)都 继承Project默认
3.在 IntelliJ Compiler:


  • File -> Settings -> Build, Execution, Deployment -> Compiler -> Java Compiler
  • 给每个模块手动指定 Bytecode version = 17(或 “Use module language level”)

    • 如果选择“Same as language level”,仍要确保这个“语言级别”是 17,否则可能被旧缓存干扰。

4.重启 & Reimport Maven


  • 在 Maven 工具窗口,点击 Reimport(小象图标)。
  • 或者 File -> Invalidate Caches / Restart
如许才能保证编辑器编译器,以及 Maven 构建 全部同一在 Java 17,防止辩论。

六、Java 版本命名与 LTS 版本先容

1. Java 版本的命名汗青:1.x 与 x



  • Java 1.8 = Java 8

    • 这并不是两个差异的版本,而是同一个版本的差异写法。官方名称里 JDK 8 的内部版本号是 1.8.0_xxx,但对外同一称作 “Java 8”。

  • Java 1.7 = Java 7,依此类推。
  • 之后 Oracle 为了简化版本号,从 Java 9 开始同一使用 整数版本:Java 9、Java 10、Java 11……。

    • 没有再继续使用“1.9”、“1.10”的叫法。

所以1.8 与 18 并非同一个版本


  • 1.8” 代表 Java 8
  • 18” 代表 Java 18,是一个截然差异的版本(发布于 2022 年初)的非 LTS 版本。

2. LTS(恒久支持)版与非 LTS



  • LTS(Long-Term Support)版本

    • Oracle 会对其提供更长时间的商业支持和更新。
    • 常见 LTS 版本:Java 8 (2014)Java 11 (2018)Java 17 (2021)Java 21 (2023)

  • 非 LTS 版本

    • 每 6 个月发布一次,生命周期短,过了半年就不再接收官方更新。
    • 如 Java 12、13、14、15、16、18、19、20、22 等。

在企业生产情况中,大多数公司依旧使用 Java LTS(例如 Java 17、Java 11),因为官方支持时间长,第三方生态也稳固。

七、总结



  • Project/Module language level(IDE 层面)

    • 决定 IDE 如何理解、检查你的 Java 源码。它是语法/提示层面的设置,并不必然同步到编译器。

  • Compiler -> Java Compiler(IDE 编译输出)

    • 决定用哪种 target 版本编译成 .class,实质就是 javac -target xxx。
    • 与 Maven 或 Gradle 的编译配置可能辩论,所以要对齐设置。

  • Maven <maven.compiler.source> / <maven.compiler.target>

    • Maven 命令行编译的官方设置。IDE 也能读取这些配置,但只有在Delegate to MavenReimport后才能保证划一。

只有三者版本同一,你的项目才能顺遂编译、运行,不会出现“警告: 源发行版 XX 必要目的发行版 XX”“无效的目的发行版: XX”“无效的源发行版: XX”等错误。

Java 版本小科普



  • 1.8 就是 Java 8(LTS,2014 年发布)。
  • 1117 也是 LTS,分别发布于 2018 年、2021 年。
  • 18、19、20、22 等属于非 LTS,支持周期很短。

以上就是这三种设置(Project language level、Module language level、Compiler Bytecode Version)之间的区别与联系,以及它们跟 Maven 配置的辩论原因和常见报错场景。最关键的原则是——要让所有地方(IDE、Maven、Gradle、JAVA_HOME)都指向同一个Java版本,才能完全制止奇怪的问题与辩论。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表