首页
Preview

从Java 8迁移到Java 11的第一步

动机

如果你的商业应用程序使用的是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

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
阿波
The minute I see you, I want your clothes gone!

评论(0)

添加评论