动机
如果你的商业应用程序使用的是Oracle JDK 8,那么现在是时候进行更改了。自2019年1月起,Oracle停止发布JDK 8的公共更新。
现在你有五个选择:
· 保留Oracle JDK 8而不接收任何更新,这是不推荐的
· 支付费用向Oracle获得Oracle JDK 8的支持
· 从Oracle JDK 8转移到OpenJDK 8分发版
· 从Oracle JDK 8迁移到有商业使用限制的Oracle JDK 11
· 从Oracle JDK 8迁移到免费分发的OpenJDK 11
如果你决定迁移到Java 11,请注意Oracle JDK 11有商业限制。另一种选择是使用免费分发的OpenJDK 11(Java仍然是免费的😬)。
本文的目的是向你展示我将一个应用程序从Java 8迁移到Java 11的个人经验。
第一步
Java版本
第一步是在pom文件中更改Java版本。
从:
<java.version>1.8 </java.version>
到:
<java.version>11 </java.version>
如果你输入Java版本“1.11”,你选择的是Java 1版本,你可能会看到很多编译问题。我们不想将我们的应用程序降级到Java 1,对吧?😄
Maven编译器
我使用的是不兼容的Maven插件版本:3.6.1。所以,我不得不将其升级到一个新版本:3.8.1。
从
<groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.6.1</version>
到
<groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version>
我在一些文章中读到,任何3.7+版本都可以工作,但我决定使用最新版本3.8.1。
Spring Boot和Spring Cloud
Spring Boot 2.0.X和旧版本不支持Java 11,所以我不得不将我的Spring Boot升级到2.1.5.RELEASE。由于我也使用Spring Cloud,所以我不得不将其升级到一个兼容的Spring Cloud版本:Greenwich版本(Greenwich.RELEASE)。
所以,在我的dependencyManagement中,我得到了:
<groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.1.5.RELEASE</version>
和
<groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Greenwich.RELEASE</version>
迁移Spring Boot会导致一些额外的工作,我可以在另一篇文章中写。在我的个人经验中,我在我的存储库中遇到了一些编译问题,因为我不得不在一些方法中返回Optional<MyObject>,这是很好的,因为我使用isPresent方法使我的应用程序更加空指针安全。
如果你不使用Spring Boot …
你可以将Lombok版本升级到1.18.8。我使用的是1.16,遇到了问题。
如果你使用javax.xml,请添加javax.xml依赖项。
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
Javax.xml在Java 9中已被弃用,并在Java 11中被删除。
Docker
我们使用的是安装了OpenJDK8的Alpine版本容器。
FROM openjdk:8-jre-alpine
截至我撰写本文时,我找不到安装有openjdk 11和Alpine的映像。继续使用Alpine的替代方法是使用来自Azul的映像。
FROM azul/zulu-openjdk-alpine:11
Zulu是Azul的OpenJDK分发。
但是,如果你想的话,仍然可以使用Debian的openjdk 11映像。
尽管Debian比Alpine更受欢迎,但我们选择Alpine主要是因为它具有更短的映像大小。
Wiremock
在升级Wiremock模块时,我遇到了@PostConstruct和@PreDestroy的一些问题。
这些注释不可用,所以我不得不实现InitializingBean和DisposableBean并覆盖以下方法:
afterPropertiesSet和destroy。
所以我从:
public class WireMockConfig {
@PostConstruct
public void init() {
…
}
@PreDestroy
public void destroy() {
…
}
}
到
public class WireMockConfig implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
..
}
@Override
public void destroy() throws Exception {
…
}
结论
感谢你阅读本文。我希望我能在这个迁移过程中以某种方式帮助到你。你可能会发现我没有提到的其他问题;欢迎在这里评论你的发现,这样你就可以与我们分享你的知识。
译自:https://medium.com/@daniel.panagio18/first-steps-of-migrating-from-java-8-to-java-11-98ea9a5eafff
评论(0)