升级的第一个重点就是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/