近期将一个框架项目从JDK6升级到JDK8,虽然到现在才升级到JDK8有一些保守,但企业项目首要的是保证稳定性。
创建branch
首先将项目在git或svn中创建一个branch,方便老项目继续维护。
修改编译器的JDK版本
maven项目修改
接下来修改pom.xml中 maven-compiler-plugin
中编译器使用JDK的版本:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArgs>
<arg>-Xlint:all,-processing</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
Intellij IDEA项目修改
使用 Intellij IDEA 进行编译的时候,如果出现 Compliance level '1.6' is incompatible with target level '1.8'. A compliance level '1.8' or better is required
错误
需要设置项目的Java编译器为1.8,首先在Preferences中设置如下(如果下拉框中没有1.8可以直接输入):
然后在 File - Project Structure 中设置Project和Modules的 Language level都为8:
如果在Intellij IDEA中没有编译错误,但运行测试的时候报错:
java: javacTask: source release 8 requires target release 1.8
可以打开项目中的 .idea/compiler.xml
文件,确保<bytecodeTargetLevel>
及其下面所有<module>
中的target属性的值都为1.8。
Intellij IDEA 运行maven install卡死的问题
这个问题跟升级JDK8没有什么直接的关系,只是在升级的过程中遇到了,所以就顺手记录下来备查。
如果使用2019.3这个版本的话,在Run中运行 maven install 命令的时候,运行一段时间就会卡死在原处,并且无法停止maven命令。但是直接在命令行中运行 mvn install
命令是正常的。以 maven install hanging 为关键词在JetBrains的You Track查询到原来是2019.3的bug(IDEA-228098、IDEA-229007),将版本升级到2019.3.1+就正常了。
PS:刚刚更新到2020.1 (Build #201.6668.121) 发现又出现这个问题,只能等官方的更新包了,如果等不及的话可以下载最新的编译版本https://confluence.jetbrains.com/display/IDEADEV/IDEA+2020.1+latest+builds安装试试。
常见的编译错误
reference to xxx is ambiguous 或 ClassCastException 错误
如果调用泛型的方法的时候,使用JDK8编译的时候经常会遇到reference to xxx is ambiguous
或 java.lang.ClassCastException: java.lang.Integer cannot be cast to [C
的错误,但JDK6或7都没有问题,这是因为JDK8对泛型的类型做了强制的要求,而非之前自动根据调用场景进行判断,我查了一下也没有一个统一的选项强制关闭,所以需要在报错的地方加上强制类型转换。通常JUnit中Assert.equalsAssert
方法会报错,因为他重载的方法很多,这里需要将类型强制转换即可。
详细信息可以参考这几篇文章:The reference to assertEquals is ambiguous when performing a unit test Reference to assertEquals is ambiguous when running a unit test
Java type inference: reference is ambiguous in Java 8, but not Java 7
生成javadoc出错
如果项目发布的时候需要使用 maven-javadoc-plugin
自动生成javadoc的时候,会出现类似下面的错误:
error: @param name not found
这是因为JDK8启用了DocLint,会对JavaDoc进行严格检查,默认是开启的,但很多时候我们不需要这种严格模式,可以使用下面的方式将其禁用:
<profiles>
<profile>
<id>java8-doclint-disabled</id>
<activation>
<jdk>[1.8,)</jdk>
</activation>
<properties>
<javadoc.opts>-Xdoclint:none</javadoc.opts>
</properties>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<additionalparam>${javadoc.opts}</additionalparam>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.3</version>
<configuration>
<reportPlugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<additionalparam>${javadoc.opts}</additionalparam>
</configuration>
</plugin>
</reportPlugins>
</configuration>
</plugin>
</plugins>
</build>
如果maven-javadoc-plugin 3.0.0+则将配置中的<additionalparam>-Xdoclint:none</additionalparam>
修改为 <doclint>none</doclint>
。
参考资料
【IDEA】Error: java: Compliance level '1.6' is incompatible with target level '1.8'. A compliance level '1.8' or better is required解决办法
Java version keeps getting reset to 1.5 when I change something (libraries in Project Settings?)
IntelliJ中Java8编译错误-‘source Release 8 Requires Target Release 1.8’
IDEA报错Target Level '1.6' Is Incompatible With Source Level '1.7'
JDK8 discussion
ClassCast error: Java 7 vs Java 8
Maven Build Hangs since 2019.3
IntelliJ 2019.3 builds Maven projects indefinitely
Maven is not working in Java 8 when Javadoc tags are incomplete