将Spring Boot应用程序迁移到最新的Java版本

Java的发布周期

首先,我已经注意到为什么我们决定从Java 8迁移到Java 11.在我们了解到Java 8支持将在2019年初停止并且它将是公共更新的结束之后,最好转向最新版本。 Java版本并随着新功能和安全更新而发展 - 然后讨论了要迁移到哪个版本的Java。

我们认为,每三个月使用LTS每六个月发布一个新版本的Oracle发布周期,我们认为最好转向使用商业生产版长期支持三年的Java 11。

下图为我们提供了Oracle即将发布的Java发布周期计划的概述。

图片标题

商业对比 OpenJDK的

在迁移之前出现了一些问题:

OpenJDK的

第三方公司有许多开源JDK实现,如IBM,RedHat和Azul,他们正式支持JDK版本。此外,Oracle支持OpenJDK,它可以在GNU通用公共许可证下免费使用。OpenJDK还有许多组件,如JVM Hotspot,JCL(Java类库),javac等。

什么是新的支持?商业支持?

在Oracle决定采用新的破坏性发布节奏和许可后,功能发布版本的使用寿命为六个月。不会提供六个月后的发布更新,我们应该使用LTS版本三年,只能由购买商业支持的人使用。

我们可以使用OpenJDK进行生产吗?

您可以自费使用OpenJDK进行生产。与您经常获得频繁更新或补丁的商业版本相比,OpenJDK更新取决于实现者以及何时发布它们。

订阅如何与Oracle的传统永久许可产品不同,例如Java SE Advanced?

永久许可软件具有前期成本以及额外的年度支持和维护费用。订阅以单一价格提供许可,更新,升级和支持。您只需支付所需的费用以及所需的时间范围(个人,非商业用途仍然是免费的,不需要订阅),

如果我使用容器平台或云,它会影响我吗?

每个用户(桌面)或处理器(服务器和/或云)都可以使用Java SE订阅。您可以查看定价模型,以准确理解和评估影响。

Oracle许可证定价

以下是Oracle发布的价格图表。如果组织根据Oracle的六个月发布计划不准备更新,则组织应根据这些定价模型来调整预算。使用此许可模式,在多核处理器上运行JDK会变得更加昂贵。

图片标题

可在此处找到Oracle产品的完整定价清单。 

此外,您可以使用Usage Tracker跟踪 Java使用情况这将有助于评估组织的Java使用情况,并基于此确定使用Java的许可版本或免费版本。

或者,您可以免费使用第三方JDK甚至Oracle的OpenJDK版本。

Spring支持JDK 11

在2018年9月的某个地方,在SpringOne平台上,宣布了Spring Framework 5.1与Java 11的支持。Spring Framework 4.3将支持Java 8,5.0将支持Java 9,而5.1将正式支持Java 11。

如果您使用的是Spring Boot,则从SpringBoot 2.1.X开始支持Java 11。计划是从Spring Boot 2.2开始正式支持Java 12。我们已经将我们的应用程序从Spring Boot 1.5.X迁移到Spring Boot 2.1.1,并使用在Java 11中编译的代码。这很顺利,在构建项目时进行了微小的更改。

此外,如果您使用Pivotal或Cloud Foundry进行PaaS解决方案,则需要采取额外措施来处理要部署的Spring Boot 2.XX版本。 

Spring Boot 2.1使用Spring Framework 5.1,Spring被更新为所有依赖项的稳定版本。因此,您可以正式使用Spring Starter和Spring Boot 2.1.1并使用Java 11进行编译。

此外,如果您使用Maven构建源代码,则需要将Maven编译器插件升级到> 3.5版本。

如果您使用Gradle构建源代码,则需要将Gradle分发版升级到5.X版。

附加依赖项,项目更改

由于Java 11已经外化了许多库和依赖项,因此我们必须向POM明确添加一些依赖项。使用J2EE模块(如JAXB,JAX-WS,JTA,JAVAX注释等)的项目应显式添加依赖项并重建。所有独立版本的J2EE都可以在Maven仓库或第三方站点中使用,因此Java SE已将其排除在外。

从Spring Boot 1.5.X迁移到Java 11 Spring Boot 2.1项目我们必须做的显着改变:

  • 如果您使用的是Eclipse IDE,请下载Eclipse photon或4.9

  •  从市场上为Eclipse IDE安装Java 11插件。

  • <java.version>  在POM中为Maven 更新   到11,或者sourceCompatibility 在build.gradle中为Gradle项目更新  到1.11。

  • 使用ASM(Java字节码库)将Maven编译器插件升级到3.8.0,或者为Gradle项目下载gradle-5.0发行版。

  • 对于Coverage,由于不再支持Cobertura,因此从Cobertura迁至Jacoco。

  • 更新Maven Surefire插件和Failsafe插件。

  • 如果您在项目中内置了单元测试(SureFire)和集成测试(FailSafe),请更新这些插件由于Maven具有不同的生命周期阶段,该  Failsafe 插件有助于在集成测试阶段构建崩溃

  • 此外,您可以在命令行上设置System JVM选项,例如<argLine>  Maven项目中的“illegal-access-permit” 

  • 由于Java中的强大封装使迁移变得困难,因此Java 9允许从类路径上的代码进行非法反射访问,因为Java 9还有更多选项可以启用反射访问,例如“permit”,“warn”,“debug” ,“和”否认,“你可以探索。

  • Java 11支持TLS 1.3,它提供了显着的安全性和性能改进。

  • 类文件错误 - 在字节码上运行的任何操作,如cglib(3.2.8),ASM(7.0),Byte Buddy(1.9.0)或Javassist(3.23.1-GA)。从Java 9开始,字节码级别每六个月增加一次,因此您必须定期更新这些库。您可能会收到如下警告,最好更新为Byte Buddy for Java 11。  

警告:一个 非法 反射 进入 操作 已经 发生
警告:非法 反射 访问 的 j9ms。内部。JPEG(文件:...)到 现场 com。太阳。imageio。插件。jpeg。JPEG。TEM
警告:请 考虑 报告 这 给 了 维护者 的 j9ms。内部。JPEG
警告:使用 - 非法- 访问= 警告 ,以 使 警告 的 进一步 非法 反射 接入 业务
警告:所有的 非法 访问 操作 将 被 拒绝 在 一个 未来的 版本
# 这里的与静态磁场com.sun.imageio.plugins.jpeg.JPEG.TEM反射访问


  • 模块化:您还可以为您的应用程序创建JRE映像。我们将应用程序模块化,从而减少了内存占用并在更大程度上优化了应用程序。

<! - 为JAVA 11支持START  - >添加
< 插件>
  < groupId > org.apache.maven.plugins </ groupId >
  < artifactId > maven-compiler-plugin </ artifactId >
  < version > 3.8.0 </ version >
  < 配置>
  < release > 11 </ release >
  </ configuration >
  < dependencies >
  < 依赖>
    <! - 更新编译器插件依赖于ASM for Java 11兼容性 - >
    < groupId > org.ow2.asm </ groupId >
    < artifactId > asm </ artifactId >
    < version > 6.2 </ version >
  </ dependency >
  </ dependencies >
</ plugin >
< 插件>
  < groupId > org.apache.maven.plugins </ groupId >
  < artifactId > maven-surefire-plugin </ artifactId >
  < 配置>
    < argLine >
    --illegal存取=许可证
    </ argLine >
  </ configuration >
</ plugin >
< 插件>
  < groupId > org.apache.maven.plugins </ groupId >
  < artifactId > maven-failsafe-plugin </ artifactId >
    < 配置>
    < argLine >
    --illegal存取=许可证
    </ argLine >
  </ configuration >
</ plugin >
<! - 为JAVA 11支持END添加 - >


Java 11引入了很多功能,我想限制本主题的范围,但是为了使用最新版本的Java,最好是探索,亲自动手,而不是迁移。 

结论

Oracle希望加速Java的开发,并且应用程序开发人员期望频繁更新。为了满足这些要求,Oracle建议将Java转换为严格的基于时间的发布模式。这意味着Java仍然可以在OpenJDK生产中自由使用,但如果您使用不支持Java 9+的框架或产品,它可能不适合使用OpenJDK 9及更高版本的生产就绪解决方案。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章