升级maven项目到Java 11

8 10月

升级maven插件

升级的第一个重点就是maven插件需要升级到最新版本,因为大部分项目还是在Java 8状态,而Java 9新增了Jigsaw,还有部分API的废弃,所以大部分maven插件都有相应的支持调整。所以插件版本是第一个需要升级的。

如果使用的插件比较多,可以使用versions-maven-plugin来检查可用的升级版本。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>versions-maven-plugin</artifactId>
    <version>2.7</version>
    <configuration>
        <generateBackupPoms>false</generateBackupPoms>
    </configuration>
</plugin>

执行mvn versions:display-plugin-updates

升级完成之后需要修改编译使用的版本,之前的maven-compiler-plugin需要指定source和target参数,现在只需要release参数就行了

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <release>11</release>
    </configuration>
</plugin>

另外由于JDK的升级,当有setAccessible(true)调用的时候会有warning消息

WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.reflection.CachedClass
WARNING: Use –illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

在需要的地方条件命令行参数即可

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>
            --illegal-access=permit
        </argLine>
    </configuration>
</plugin>

升级依赖

并不是所有依赖都需要升级,但是涉及到字节码增强的依赖最好升级,比如javassist, cglib, byte-buddy 和 asm。

寻找新版本也可以使用插件,执行

mvn versions:display-dependency-updates

缺失的依赖

由于Java 9的模块化改造,有一些依赖可能需要手动执行,比如javax.annotations等,可以在POM中新增依赖补回来

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.4.0-b180725.0427</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.4.0-b180725.0644</version>
</dependency>

参考

https://winterbe.com/posts/2018/08/29/migrate-maven-projects-to-java-11-jigsaw/

发表评论

电子邮件地址不会被公开。