又遇到一个难搞的bug,难搞的原因是不是必现,且代码层面也没看出问题。
这就有点难受了,一下子也没有思路。没办法,只能祭起法宝“日志定位法”。
好在日志看着看着,有了点想法,想调试验证一下。
项目太大调试起来特别费时间
想起来有个简单的老项目,想在上面验证下想法。
就是这么一个纯粹的想法,老项目也不支持,直接报错:

这个很容易解决。
稍等

,你说的“很彻底”不是指解决一个 “-source 1.6 中不支持 diamond 运算符”报错吧,太水了
当然不是了。如果说这个错改过一次后反复出现呢?
交待下背景:

项目module已经指定了source和target
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>先说解决办法:

在任意一个项目文件上点右键->“Open Model Settings”

将Language Level配置为“8-Lambdas,type annotations etc.” 然后,点保存。
建议再检查下Project上的Language Level的设置,

如果不是,也要按上面的调整。
就这?谁不会!!!
实际上只改上面两个地方是不行的,还需要再重新配置下这里:


改为8,然后点保存。 因为jdk1.6是不支持Lambda的

正确的配置
稍等,这个的确很常规,但你这样操作后,项目是可以跑的。
但,重新跑时,又会报上面的错。即同样的错误反复出现
原因在哪呢?
就不啰嗦了,直接上结果:

把maven-compiler-plugin插件配置的jdk版本错了。 需要把1.6改为1.8 IDEA中language level报错,也是这个地方的原因。想想为什么?
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>当前项目的source和target要配置为1.8
在Maven构建系统中,maven-compiler-plugin 是一个用于编译项目源代码的插件。source 和 target 是插件配置的两个重要参数: source:指定了项目源代码使用的 Java 语言版本。<source>1.8</source> 表示源代码使用的是 Java 8 语言特性。 target:指定了编译后的字节码应该兼容的 Java 运行时环境版本。<target>1.8</target> 表示编译生成的字节码将兼容 Java 8 运行时环境。 简单来说,这两个配置项确保了项目在编译时使用的 Java 语言特性和生成的字节码的运行时的兼容性。 kimi
先把pom.xml中的jdk版本设置正常,只要经过上面的重新设置后,仍多次报错,都是pom.xml中的Maven的版本配置有问题,特别是老项目。
小结一下,如果出现“-source 1.6 中不支持 diamond 运算符”,需要按下面顺序检查,如果有出现JDK版本配置没有>=1.8,则都需要重新配置为>=1.8。
虽然从Java7开始已经支持diamond 运算符了,但在实际生产环境中使用的很少。
检查项1:
maven-compiler-plugin插件 要检查配置的source、target的版本号,确保>=1.8
检查项2:

检查项3:

检查项4:

完工。
想下为什么maven-compiler-plugin插件的source和target配置会影响到IDEA?
因为IDEA第一次打开项目时,啥也不知道。为了方便,会从这些配置中找到相关的信息,并进行自动适配。如果你配错了,IDEA就跟着错了。
Maven真是一个了不起的创新。 Maven的坐标为各种构件引入了秩序,秩序的建立才是管理的开始。有个坐标机制,才让软件组件的版本和依赖管理越来越高效。 Maven可以最大化消除项目构建的重复。构建?编译、跑UT、生成文档、打包和部署 Maven的核心作用是编译、测试、打包,它抽象了构建生命周期,并且为绝大部分的构建任务提供了已实现的插件,我们不再需要定义过程,甚至不需要再去实现这些过程中的一些任务。