第一个地方:这个可能就是你整个项目的jdk版本的使用,你改了这里大概率可以改了
第二个地方:
就是 有关maven项目的 pom文件
一开始我的第一地方用的是 17 但是这里用的是8
但是运行的时候还是 17
这里可能是 maven的 项目这个地方只是对打包用的jdk8吧
开发工具和构建工具的行为差异
- 开发工具优先性:通常开发工具(如 IntelliJ IDEA)在运行项目时可能会优先使用其项目设置中的 JDK 版本。在你的情况下,尽管项目结构中显示的是 JDK 17,但 pom 文件中指定的是 JDK 8。开发工具在运行项目时可能会依据自身的配置和优先级规则,选择使用项目结构中设置的 JDK 17 来执行项目。这是因为开发工具通常会根据项目的具体配置和环境变量来确定运行时的 JDK 版本,并且在运行过程中可能会覆盖构建工具(Maven)中的设置。
- 构建工具的作用范围:Maven 在构建项目时会根据 pom 文件中的配置进行编译、测试和打包等操作。然而,Maven 对 JDK 版本的设置主要影响构建过程,而不一定直接决定项目的运行时环境。在构建阶段,Maven 会根据 pom 文件中指定的 JDK 版本调用相应的编译器和工具来处理源代码,但在运行项目时,开发工具可能会有自己的运行时配置机制,这可能导致实际运行时使用的 JDK 版本与 Maven 构建时指定的版本不一致。
二、优先级判断
- 一般来说,开发工具的项目设置在运行项目时可能具有较高的优先级。这是因为开发工具直接控制项目的运行环境,并且会根据其自身的配置和用户设置来选择合适的 JDK 版本。然而,具体的优先级可能因开发工具的不同版本和配置而有所变化。
- 在构建过程中,Maven 的设置对于确保项目的正确构建和依赖管理非常重要。但在运行项目时,开发工具可能会根据其自身的逻辑和优先级来确定使用哪个 JDK 版本。
第三个地方:
这里的有什么用?
大概是在编译的时候 idea 指定的版本。
构建、执行、部署 > 编译器 > Java 编译器设置
一、编译源代码
- 生成字节码:Java 编译器将 Java 源代码转换为字节码,这是一种与平台无关的中间表示形式。字节码可以在任何安装了适当 Java 运行时环境(JRE)的平台上运行,实现了 “一次编写,到处运行” 的特性。例如,开发人员编写的 Java 类文件经过编译器处理后,生成的字节码可以在 Windows、Linux 和 macOS 等不同操作系统上执行,只要这些系统上安装了兼容的 JRE。
- 语法检查和错误报告:编译器在编译过程中会检查源代码的语法正确性。如果发现语法错误,编译器会报告错误信息,帮助开发人员快速定位和修复问题。例如,如果开发人员在代码中遗漏了分号、括号不匹配或者使用了未定义的变量,编译器会指出这些错误,以便开发人员进行修正。
- 类型检查和安全性保障:编译器会进行类型检查,确保在程序运行时不会出现类型不匹配的错误。这有助于提高程序的安全性和稳定性。例如,编译器会检查方法调用中参数的类型是否正确,以及变量的赋值是否符合其类型要求。如果发现类型不匹配的情况,编译器会发出错误提示,防止在运行时出现不可预测的错误。
二、优化和性能提升
- 代码优化:现代 Java 编译器通常会进行各种优化,以提高生成的字节码的性能。这些优化包括但不限于常量折叠、方法内联、循环优化等。例如,编译器可能会将一些常量表达式在编译时进行计算,并将结果直接嵌入到生成的字节码中,减少运行时的计算开销。方法内联可以将小的方法调用直接替换为方法体的代码,减少方法调用的开销。循环优化可以对循环结构进行分析和优化,提高循环的执行效率。
- 目标字节码版本控制:通过设置项目字节码版本和模块目标字节码版本,开发人员可以控制生成的字节码的版本,以适应不同的运行环境和需求。例如,如果项目需要在旧版本的 JRE 上运行,可以将字节码版本设置为较低的版本,以确保兼容性。同时,编译器也会根据目标字节码版本进行相应的优化和调整,以提高在特定版本 JRE 上的性能。
第四个地方:
这个可能是运行环境的配置jre java虚拟机的版本
构建、执行、部署 > 构建工具 > Maven > 运行程序设置中的 JRE 设置
- 虚拟机支持:JRE 包含了 Java 虚拟机(JVM),这是 Java 程序能够在不同操作系统上运行的关键。JVM 负责将 Java 字节码转换为特定操作系统和硬件平台能够理解的机器指令,并执行这些指令。不同的操作系统有不同版本的 JVM,但 Java 程序可以在任何安装了适当 JRE 的平台上运行,而无需进行修改。例如,一个在 Windows 上开发的 Java 项目,可以在 Linux 或 macOS 等其他操作系统上运行,只要这些系统上安装了兼容的 JRE。
- 核心类库:JRE 还提供了大量的核心类库,这些类库包含了 Java 程序运行所需的基本功能,如输入输出处理、网络通信、图形用户界面、日期和时间处理等。开发人员在编写 Java 程序时,可以直接使用这些类库中的类和方法,而无需从头开始实现所有的功能。例如,当开发一个网络应用程序时,可以使用 JRE 中的
java.net
包来实现网络通信功能。
还有一个地方:
就是maven的settings.xml 里面也有java版本的指定,这个就不知道哪个优先级更高了,但是我变了几次都是在第一个地方改了,就改了。
最后总的来说就是,
把这几个地方都改成一样的应该就不会有什么问题,要是改了没用,可能就是有缓存,重启一下。本着也是记录一下这几个可以改的地方。不用每次都去查其他的了。