下午更新代码的时候,报了如下问题。当时很奇怪,第一感觉,jdk出现了问题,但是确认了很多次,jdk没有问题。然后去小何那里,发现更新代码之后,出现了同样的问题。反馈给架构组,才发现,原来是maven插件编译的版本由原来的1.7被修改成为了1.6,而我们idea中配置的jdk为1.8,所以导致使用Java7特性的一些代码,会报错。
1.问题截图
大家可以发现,List<ChooseCourseModel> chooseCourseModelList=new ArrayList<>();报错了。错误提示,Java 1.6中不支持这种泛型写法。
更改为List<ChooseCourseModel> chooseCourseModeList=new ArrayList<ChooseCourseModel>();之后,错误消失。
2.原因
maven是个项目管理工具,如果我们不告诉它我们的代码要使用什么样的jdk版本编译的话,它就会用maven-compiler-plugin默认的jdk版本进行处理,这样就容易出现版本不匹配的问题。例如上图中的问题:代码中使用了jdk1.7的新特性,但是maven在编译的时候,使用的是jdk1.6的版本,那么这一段代码完全不能够编译成为.class文件的。所以为了处理这种情况,我们在构建maven项目的时候,需要配置maven-compiler-plugin插件的版本。
3.为什么要修改?
架构组告知,是root.pom文件中的maven插件编译版本,由原来的1.7更改为了1.6.
更改原因是:版本越低,兼容性越好,以后系统上线之后,可以更好地适应各个高校的使用。这个我理解,但是我不太懂的是,maven项目编译的项目怎么跟JDK版本关联起来的?接下来主要了解一下maven-compier-plugin插件的使用。
4.maven-compiler-plugin插件
maven 本质上是一个插件框架,它的核心并不执行具体的构建任务,所有的这些任务全都交给插件来完成。例如编译源代码是由maven-compiler-plugin来完成的。此插件用来编译位于src/main/java目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码。由于历史原因,Maven的核心插件之一,maven3 compiler插件默认值支持Java1.5,因此我们需要配置该插件支持适合自己项目的版本。
如在下图是在项目中配置的maven-compiler-plugin。
<!-- maven版本 -->
<!--工程打包自动添加时间戳后缀 -->
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding> <!-- 编译时的编码 -->
<maven.compiler.source>1.7</maven.compiler.source> <!-- 编译源代码 jdk版本编译 -->
<maven.compiler.target>1.7</maven.compiler.target> <!-- 编译源代码 版本 -->
<maven-compiler-plugin.version>3.6.1</maven-compiler-plugin.version> <!-- 编译插件版本号控制 -->
<maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version> <!-- 编译插件版本号控制 -->
compiler-plugin主要注意问题:
(1):maven 2.1默认用jdk 1.3来编译,maven 3 貌似是用jdk 1.5,如果项目用的jdk 1.6也会有问题,compiler插件可以指定JDK版本为1.6。
(2):windows默认使用GBK编码,java项目经常编码为utf8,也需要在compiler插件中指出,否则中文乱码可能会出现编译错误。
小结:
maven还需要再次系列学习,遇到问题了,才知道原来学习的是多么浅薄。