原文地址:https://blog.codefx.org/java/java-11-migration-guide/。 在原文的基础上,增加了一些我遇到的具体的坑还有在特定场景下的解决方案,供大家参考
一些背景
在背景知识,我们会讨论一些关于新的JDK Release周期,OpenJDK特性归一化,LTS(Long-term support长期支持版本)的事情。
1. 新的发布周期
这个就可以长话短说了,反正我们知道如下两点就好:
- 每六个月发布一个大更新(就是每年的3月还有9月)
- 对于每个大版本更新,会有两次小版本更新(在发布后一个月或者四个月之后)
2. OpenJDK已可以作为新的线上标准JDK
在2018.9之前,Oracle JDK是大家普遍运用于线上的JDK,OpenJDK的特性并不完全,并且Oracle JDK号称做了很多优化。在2018.9之后,Oracle JDK正式商用(开发不收费,但是运行线上业务收费)。但是与此同时,Oracle宣布,OpenJDK与Oracle JDK在功能上不会有区别。并且,OpenJDK 11 RTS将会由红帽社区进行维护。这样,更加增加了可靠性与保证问题的及时解决。
我们可以在线上使用OpenJDK,开发时,使用任意的JDK。
3. LTS(Long-term support长期维护)版本
对于商业版的JDK,不同的厂商都将长期维护版本定在JDK 11/17/23/...
对于OpenJDK,社区说,对于这些版本,至少会提供四年的维护更新时间。每个长期维护版本都会有一个固定的管理者,对于OpenJDK11,应该就是红帽社区。现在源代码搞定了,但是,我们应该从哪里获取编译好的OpenJDK呢?这个可以交给AdoptOpenJDK,它会一直收集不同版本的OpenJDK以及全平台的build好的OpenJDK
4. Amazon Corretto
AWS也提供了自己的OpenJDK,Amazon Corretto:
- 基于OpenJDK,采取GPL+CE协议,做了一些安全性,性能和稳定性优化,并且修复了一些bug
- 支持linux,MAC OS还有Windows操作系统
- 长期支持Java 8并且至少到2023年
- 从2019年开始支持Java 11并且至少到2024
- 季度更新,并且伴随一些紧急bug修复的更新
OpenJDK社区的FAQ部分曾经提到:“Amazon从2017年开始贡献OpenJDK,并且计划开始大量贡献”。我猜Amazon会把他们在Corretto上面做的优化,合并到OpenJDK源码中,即使没有,Corretto也是开源的,迟早会有人参考并在OpenJDK源码上进行修改。同时也说明,OpenJDK的更新也会及时被合并到Corretto中。
准备迁移
1. 更新好开发环境以及编译环境
各种常用工具,建议升级到如下版本以后:
- IntelliJ IDEA: 2018.2
- Eclipse: Photon 4.9RC2 with Java 11 plugin
- Maven: 3.5.0
- Maven compiler plugin: 3.8.0
- surefire and failsafe: 2.22.0
- Gradle: 5.0
对于如下工具,由于已经不再维护,需要替换成其他工具:
- FindBugs(静态代码bug发现): 用SpotBugs替换。
- Cobertura(代码测试覆盖率):用Jacoco替换
同时由于在Java 9 之后,每六个月bytecode level会提升一次。如果你依赖的库有处理字节码相关的库,应该注意下版本升级,例如:
- 对于直接操作字节码的库,如果你升级了JDK,那么最好也跟着升级这些库:ASM (7.0), Byte Buddy (1.9.0), cglib (3.2.8), or Javassist (3.23.1-GA).这些版本是OpenJDK11适用的版本
- 如果你使用的库依赖了上面提到的操作字节码的库,那么也需要注意下版本依赖,看依赖的操作字节码的库是否升级到了上面提到的版本。对于Spring,最好采用5.1以后的版本, Mockito则是2.20.0以后的版本
2. 引入JPMS后,相关的迁移工作
2.1. Java EE相关模块默认不在Java包里面了,相关的类需要增加额外依赖或者替换成其他的类
如果你的项目中使用了这些类,那么在编译阶段就会报错,例如: