• 极客文库-知识库上线!
  • 极客文库小编@勤劳的小蚂蚁,为您推荐每日资讯,欢迎关注!
  • 每日更新优质编程文章!
  • 更多功能模块开发中。。。

Spring Boot 应用迁移到 Java 11

你的 Spring Boot App 需要迁移到 Java 11 吗?
最近,我们开始将应用程序从 Java 8 迁移到 Java 11;在此之前,Oracle 宣布将从 2019 年初开始停止为 Java 8 提供商业支持。
我想限制这个主题的范围 ,因为我不会详细讨论 Java 11 及其特性,但是,我将尝试在迁移到 Java 的最新版本的过程中,对迁移步骤提供一个深入的说明。

Java 发布周期

首先,我已经注意到为什么我们决定从 Java 8 迁移到 Java 11。之后我们了解到 Java 8 支持将停止在 2019 年初结束,并将公共更新,最好是搬到最新版本的 Java 和演变的新特性和安全更新,然后是哪个版本的 Java 迁移的讨论。
回顾 Oracle 的发布周期,每六个月发布一个新版本,每三年发布一次 LTS,我们认为最好是迁移到 Java 11,并对商业生产版本提供三年的长期支持

商业 vs OpenJDK

在迁移之前有几个问题:

OpenJDK

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

有什么新的支持吗?商业支持吗?

在 Oracle 决定迁移到一个新的破坏性版本 cadence 和许可之后,一个特性版本的生命周期将是 6 个月。六个月后的版本更新将不会提供,我们应该提供一个 LTS 版本三年,只能用于购买商业支持的人。

我们可以将 OpenJDK 用于生产环境吗?

您可以免费在生产环境中使用 OpenJDK,费用由您自己承担。与您经常获得更新或补丁的商业版本相比,OpenJDK 的更新取决于实现者以及他们何时发布它。

订阅与传统的 Oracle 永久授权产品(如 Java SE Advanced)有何不同?

永久许可的软件有一个预先的成本加上额外的年度支持和维护费用。订阅以单一价格提供许可证、更新、升级和支持。您只需要为您需要的内容和所需的时间框架付费(个人、非商业用途仍然是免费的,不需要订阅),

使用容器平台或云是否会影响我?

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

甲骨文许可定价

以下是 Oracle 发布的价格表。如果组织不准备按照 Oracle 六个月的发布计划频繁更新,则应该根据这些定价模型调整预算。使用这种许可模型,在多核处理器上运行 JDK 可能会变得更加昂贵
甲骨文产品价格的完整列表可以在这里找到。
此外,您还可以使用使用 Usage Tracker 跟踪 Java 使用情况。这将有助于评估您的组织对 Java 的使用情况,并在此基础上决定使用许可的或免费的 Java 版本。
或者,您可以免费使用第三方 jdk,甚至 Oracle 的 OpenJDK 版本。

Spring 对 JDK11 的支持

在 2018 年 9 月的某个时候,在 SpringOne 平台上,宣布了 Spring Framework 5.1 对 Java 11 的支持。Spring Framework 4.3 将支持最多 Java 8, 5.0 将支持 Java 9, 5.1 将正式支持 Java 11。
如果您正在使用 SpringBoot,那么从 Spring Boot 2.1.X 开始就支持 Java 11。计划从 Spring Boot 2.2 开始正式支持 Java 12。我们已经从 Spring Boot 1.5.x 迁移应用程序到 Spring Boot 2.1.1,使用 Java 11 编译的代码。这是顺利的,在建设项目的一些小变化。
此外,如果您正在为 PaaS 解决方案使用 Pivotal 或 Cloud Foundry,那么在 Spring Boot 2.X.X 部署的版本中还必须注意一些额外的措施。
Spring Boot 2.1 使用 Spring Framework 5.1,将 Spring 更新为所有依赖项的稳定版本。因此,您可以在 Spring Boot 2.1.1 中正式使用 Spring Starter 并使用 Java 11 编译。
此外,如果使用 Maven 构建源代码,则需要将 Maven 编译器插件升级到> 3.5 版本。
如果您使用 Gradle 构建源代码,您需要将 Gradle 发行版升级到 5.X 版本。

附加依赖项,项目变更

由于 Java 11 已经外部化了许多库和依赖项,所以我们必须显式地向 POM 添加一些依赖项。使用 JAXB、JAX-WS、JTA、JAVAX 注释等 J2EE 模块的项目应该显式地添加依赖项和重新构建。J2EE 的所有独立版本都可以在 Maven repo 或第三方站点中轻松获得,因此,Java SE 将它们排除在外。
为了从 Spring Boot 1.5 迁移,我们必须做的一些显著更改。X to Java 11 Spring Boot 2.1 项目:
  • 如果您正在使用 Eclipse IDE,请下载 Eclipse photon 或 4.9
  • 从市场上为 Eclipse IDE 安装 Java 11 插件。
  • 将 Maven 的 POM< java.version>更新到 11,或 gradle 构建的项目的 sourceCompatibility 更新到 1.11。
  • 使用 ASM (Java 字节码库)将 Maven 编译器插件升级到 3.8.0,或者下载 Gradle 项目的 grade -5.0 发行版。
  • 对于 Coverage ,从 Cobertura 迁移到 Jacoco,因为 Cobertura 不再受支持。
  • 更新 Maven Surefire 插件和故障安全插件。
  • 如果在项目中构建了单元测试(SureFire)和集成测试(FailSafe),则更新这些插件。由于 Maven 有不同的生命周期阶段,Failsafe 插件有助于在集成测试阶段构建崩溃
  • 此外,对于 Maven 项目,您可以在命令行上设置系统 JVM 选项,如“非法访问-许可证”
  • 由于 Java 中的强封装(这使得迁移非常困难),因此自 Java 9 以来,默认情况下允许从类路径上的代码进行非法反射访问。您可以使用更多选项来启用反射访问,如“permit”、“warn”、“debug”和“deny”。
  • Java 11 支持 TLS 1.3,它提供了显著的安全性和性能改进。
  • 类文件错误——任何操作字节码的错误,如 cglib(3.2.8)、ASM(7.0)、Byte Buddy(1.9.0)或 Javassist (3.23.1-GA)。自从 Java 9 以来,字节码级别每六个月增加一次,所以您必须定期更新这些库。您可能会收到如下警告,最好将 Java 11 更新为 Byte Buddy。

  1. WARNING: An illegal reflective access operation has occurred


  2. WARNING: Illegal reflective access by j9ms.internal.JPEG (file:...) to field com.sun.imageio.plugins.jpeg.JPEG.TEM


  3. WARNING: Please consider reporting this to the maintainers of j9ms.internal.JPEG


  4. WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations


  5. WARNING: All illegal access operations will be denied in a future release


  6. # here's the reflective access to the static field com.sun.imageio.plugins.jpeg.JPEG.TEM

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

  1. <!-- Added for JAVA 11 Support START-->


  2. <plugin>


  3.  <groupId>org.apache.maven.plugins</groupId>


  4.  <artifactId>maven-compiler-plugin</artifactId>


  5.  <version>3.8.0</version>


  6.  <configuration>


  7.  <release>11</release>


  8.  </configuration>


  9.  <dependencies>


  10.  <dependency>


  11.    <!-- update compiler plugin dependency on ASM for Java 11 compatibility -->


  12.    <groupId>org.ow2.asm</groupId>


  13.    <artifactId>asm</artifactId>


  14.    <version>6.2</version>


  15.  </dependency>


  16.  </dependencies>


  17. </plugin>


  18. <plugin>


  19.  <groupId>org.apache.maven.plugins</groupId>


  20.  <artifactId>maven-surefire-plugin</artifactId>


  21.  <configuration>


  22.    <argLine>


  23.    --illegal-access=permit


  24.    </argLine>


  25.  </configuration>


  26. </plugin>


  27. <plugin>


  28.  <groupId>org.apache.maven.plugins</groupId>


  29.  <artifactId>maven-failsafe-plugin</artifactId>


  30.    <configuration>


  31.    <argLine>


  32.    --illegal-access=permit


  33.    </argLine>


  34.  </configuration>


  35. </plugin>


  36. <!-- Added for JAVA 11 Support END-->

Java 11 已经引入了许多特性,我希望限制这个主题的范围,但是最好是探索、掌握这些特性,而不是为了使用最新版本的 Java 而迁移。

结论

Oracle 希望加快 Java 的开发,而应用程序开发人员也期待着频繁的更新。为了满足这些需求,Oracle 建议将 Java 转换为严格的、基于时间的发布模式。这意味着 Java 仍然可以在 OpenJDK 的生产环境中自由使用,但是如果您使用的框架或产品不支持 Java 9+,那么它可能不是使用 OpenJDK 9 或更高版本的合适的、可用于生产的解决方案。
正如标题所说,我只关注于将 Spring 引导 Maven 项目迁移到 Java 11。迁移中可能还有许多其他方面,比如安全性、JVM 性能、证书、云就绪程度等等。请随意对您的发现发表评论!

附加资源



丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:Spring Boot 应用迁移到 Java 11
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

欢迎 注册账号 登录 发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ

247507792

工作时间:09:00-23:00

新浪微博:点我访问

个人博客:点我访问