将项目由JDK6或7升级到JDK8

近期将一个框架项目从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-228098IDEA-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 ambiguousjava.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

发表评论

电子邮件地址不会被公开。 必填项已用*标注