JDK11变化详解&JDK8升级JDK11详细指南

原文链接:https://yq.aliyun.com/articles/659407 

官方英文原版: https://docs.oracle.com/en/java/javase/11/migrate/index.html#JSMIG-GUID-C25E2B1D-6C24-4403-8540-CFEA875B994A

Java平台,标准版

Oracle JDK迁移指南

第11版

E94894-01

2018年9月

入门

本指南的目的是帮助您识别潜在问题,并在将现有Java应用程序迁移到最新JDK版本时为您提供有关如何继续的建议。该指南还强调了对最新版本所做的重大更改和增强。

本指南包含以下部分:

  • JDK 11发布的重大变化

  • 准备迁移

  • 从JDK 8迁移到以后的JDK版本

  • 下一步

JDK 11发布的重大变化

在将应用程序迁移到JDK 11之前,您应该了解它与JDK 10版本之间的更新和更改。如果要从JDK 8迁移,则还应熟悉从JDK 8迁移到以后的JDK版本中描述的JDK 8和更高版本之间的差异。

以下是JDK 11中的一些重要更改:

  • Oracle不再提供JRE和Server JRE下载; 因此,自动更新不再可用。

  • Oracle不再提供32位Windows下载。

  • JDK中不提供Java Web Start,Java插件和Java控制面板。请参阅删除部署堆栈。

  • JDK中不再包含JavaFX。它现在可以从https://openjfx.io/单独下载。

  • JAXB和JAX-WS不再与JDK捆绑在一起。请参阅删除Java EE和CORBA模块。

此外,还需要了解与安全相关的更新以及很少删除的工具和组件。看到:

  • 安全更新

  • 删除了API,工具和组件

删除部署堆栈

Java部署技术在JDK 9中已弃用,在JDK 11中已删除。

Java applet和Web Start功能,包括Java插件,Java Applet Viewer,Java控制面板和Java Web Start,以及工具,已在JDK 11中删除。

请参阅 删除Java部署技术。

删除Java EE和CORBA模块

在JDK 11中,删除了Java EE和CORBA模块。不推荐在JDK 9中删除这些模块。

删除的模块是:

  • java.xml.ws:用于XML Web服务的Java API(JAX-WS),用于Java平台的Web服务元数据以及用于Java的附件的SOAP(SAAJ)
  • java.xml.bind:用于XML绑定的Java体系结构(JAXB)
  • java.xml.ws.annotation:Java SE定义的JSR-250 Common Annotations的子集,用于支持Web服务
  • java.corba:CORBA
  • java.transaction:Java SE定义的Java Transaction API的子集,用于支持CORBA对象事务服务
  • java.activation:JavaBeans Activation Framework
  • java.se.ee:上面六个模块的聚合器模块
  • jdk.xml.ws:JAX-WS的工具
  • jdk.xml.bind:JAXB的工具

如果不更改构建,则不会编译引用这些API中的类的现有代码。同样,在这些API类的引用的类路径上的代码将失败,或者,除非改变了应用程序的部署制成。

请参阅JEP 320:删除Java EE和CORBA模块以获取有关模块可能替换的更多信息。

注意:

您可以从Maven下载JAXB和JAX-WS。

安全更新

JDK 11版本包括传输层安全性(TLS)1.3规范(RFC 8446)的实现。

TLS 1.3是传输层安全性(TLS)协议的最新版本(2018年8月),默认情况下在JDK 11中启用。此版本不仅关注速度改进,还通过强调现代加密技术来更新协议的整体安全性。实践,并禁止过时或弱的加密算法。(例如,不再允许RSA密钥交换和普通DSA签名。)

TLS 1.3协议中添加了一些功能以提高向后兼容性,但有几个问题需要注意。有关详细信息,请参阅JEP 332。

删除安全证书

已从JDK 11中的信任库中删除以下根证书:

  • 几个Symantec根CA.

  • 巴尔的摩Cybertrust代码签署加州

  • SECOM根证书

  • AOL和Swisscom根证书

使用已删除证书的产品可能不再有效。如果需要这些证书,则必须使用缺少的证书配置和填充cacerts。为了证书添加到信任,看到密钥工具在<cite style=”box-sizing: border-box;”>Java平台,标准版工具参考</cite>指南。

删除了API,工具和组件

本节提供有关在JDK 11中删除的API,工具和组件的详细信息。

在JDK 11中删除了API

在JDK 11中删除了以下API。许多这些API在以前的版本中已被弃用,并且已被更新的API替换。有关可能的替代方案的信息,请参阅JDK 11 API规范。

JDK 11未提供的工具和组件

以下是JDK 11未附带的工具和组件列表。

主要工具

请参阅JDK-8200146:删除appletviewer启动器。

CORBA工具

此外,(RMI编译器)将不再支持或选项。请参阅 JDK 11发行说明。

Java Web服务工具

请参阅JEP 320:删除Java EE和CORBA模块。

Java部署工具

注意:

并且已被弃用,可能会在将来的JDK版本中删除。

请参阅从JDK和JEP中删除JavaFX 336:弃用Pack200工具和API。

监控工具

  • :在JDK 11中,JMC作为独立程序包提供,而不是捆绑在JDK中。

请参阅从JDK和Java Mission Control中删除JMC。

JVM管理-MIB.mib中

已删除通过SNMP进行JVM监视和管理的规范。请参阅删除JVM-MANAGEMENT-MIB.mib。

SNMP代理

该 模块已被删除。请参阅删除SNMP代理。

Oracle桌面特定删除

  • Oracle JDK T2K字体光栅器已被删除。
  • Lucida字体:Oracle JDK不再提供任何字体,完全依赖于操作系统上安装的字体。请参阅从Oracle JDK中删除Lucida字体。

准备迁移

以下部分将帮助您成功迁移您的应用程序:

  • 下载最新的JDK

  • 在重新编译之前运行程序

  • 更新第三方库

  • 如果需要,编译您的应用程序

  • 在您的代码上运行jdeps

下载最新的JDK

下载并安装最新的JDK版本。

在重新编译之前运行程序

尝试在最新的JDK版本(JDK 11)上运行您的应用程序。大多数代码和库应该在JDK 11上运行而不做任何更改,但可能有一些库需要升级。

注意:

迁移是一个迭代过程。您可能会发现最好首先尝试运行您的程序(此任务),然后或多或少地并行完成这三项任务:

  • 更新第三方库

  • 如果需要,编译您的应用程序

  • 在您的代码上运行jdeps。

运行应用程序时,请从JVM中查找有关过时VM选项的警告。如果VM无法启动,请查找已删除的GC选项。

如果您的应用程序成功启动,请仔细查看您的测试并确保其行为与您使用的JDK版本相同。例如,一些早期采用者注意到他们的日期和货币格式不同。请参阅默认使用CLDR区域设置数据。

要使代码适用于最新的JDK版本,请了解每个JDK版本中的新功能和更改。

  • 有关JDK 11中的新功能和更改的详细信息,请参阅JDK 11中的新增功能 – 新增功能和增强功能。

  • 有关新功能和更改JDK 10的详细信息,请参阅什么在JDK 10的新功能。

  • 对于所有的JDK 9的新功能的完整列表,请参阅什么在JDK 9的新功能。

    有关JDK 9中的更改的详细信息,请参阅JDK 9发行说明。

即使您的程序似乎成功运行,您也应该完成本指南中的其余步骤并查看问题列表。

更新第三方库

对于您使用的每个工具和第三方库,您可能需要具有支持最新JDK版本的更新版本。

检查第三方库和工具供应商的 站,以获取适用于最新JDK的每个库或工具的版本。如果存在,则下载并安装新版本。

如果使用Maven或Gradle构建应用程序,请确保升级到支持最新JDK版本的更新版本。

如果使用IDE开发应用程序,则可能有助于迁移现有代码。NetBeans,Eclipse和IntelliJ IDE都有可用的版本,包括对最新JDK的支持。

您可以在OpenJDK wiki上的Quality Outreach上看到OpenJDK 构建的许多免费开源软件(FOSS)项目的测试状态。

如果需要,编译您的应用程序

使用最新的JDK编译器编译代码将简化向未来版本的迁移,因为代码可能依赖于已被确定为有问题的API和功能。但是,并非绝对必要。

如果需要使用JDK 11编译器编译代码,请注意以下事项:

  • 如果在源代码中使用下划线字符(“_”)作为单字符标识符,则代码将无法在JDK 11中编译。它在JDK 8中生成警告,并从JDK 9开始生成错误。

    举个例子:

    此代码从编译器生成以下错误消息:

  • 如果使用和选项,则检查您使用的值。

    支持的值为11(默认值),10,9,8,7和6(不推荐使用6,并且在使用此值时会显示警告)。

    在JDK 8,和1.5 / 5的值和更早被弃用,并引起了警告。在JDK 9及更高版本中,这些值会导致错误。

    如果可能,请使用新标志而不是和选项。见在<cite style=”box-sizing: border-box;”>Java平台,标准版工具参考</cite>。

    该标志的有效参数遵循与之相同的策略,并且一加三后退。

    它可以识别和处理所有以前的JDK的类文件,一直回到JDK 1.0.2类文件。

    请参阅JEP 182:退休javac -source和-target选项的政策。

  • 在JDK 11中仍然可以访问关键的内部JDK API,例如sun.misc.Unsafe,但是在编译时无法访问大多数JDK的内部API。您可能会收到编译错误,指出您的应用程序或其库依赖于内部API。

    要标识依赖项,请运行Java依赖关系分析工具。请参阅在您的代码上运行jdeps。如果可能,请更新代码以使用支持的替换API。

    您可以使用该选项作为临时解决方法来编译源代码,并引用JDK内部类。

  • 您可能会看到比以前更多的弃用警告。

在您的代码上运行jdeps

在应用程序上运行该工具,以查看应用程序和库所依赖的包和类。如果您使用内部API,则可以建议替换以帮助您更新代码。

要查找内部JDK API的依赖项,请使用该选项运行。例如,如果您在调用的类上运行,您将看到:

如果您使用Maven,则可以使用 插件。

对于语法,请参见在<cite style=”box-sizing: border-box;”>Java平台,标准版工具参考</cite>。

请记住,这是一个静态分析工具,代码的静态分析可能无法提供完整的依赖项列表。如果代码使用反射来调用内部API,则不会警告您。

从JDK 8迁移到以后的JDK版本

JDK 8和后来的JDK版本之间发生了重大变化。

每个新的Java SE版本都会引入一些二进制,源代码和行为不兼容的版本。在JDK 9中发生的Java SE平台的模块化带来了许多好处,但也带来了许多变化。仅使用官方Java SE平台API和受支持的JDK特定API的代码应继续无变化地工作。使用JDK内部API的代码应继续运行,但应迁移以使用支持的API。

以下部分描述了在将JDK 8应用程序迁移到以后的JDK版本时应注意的JDK包和API中的更改。

查看运行应用程序时可能遇到的更改列表。

  • 新版本 – 字符串方案

  • 了解运行时访问警告

  • 对已安装的JDK / JRE映像的更改

  • 删除或更改的API

  • 部署

  • JDK 9中的安全更新

  • 垃圾收集的变化

  • 删除了工具和组件

  • 删除了特定于macOS的功能

当您的应用程序在最新版本的JDK上成功运行时,请查看后续步骤,这将帮助您避免将来的版本出现问题。

了解运行时访问警告

某些工具和库使用反射来访问仅供内部使用的JDK部分。在将来的JDK版本中将禁用此非法反射访问。目前,默认情况下允许并发出警告。

例如,以下是启动Jython时发出的警告:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年10月5日
下一篇 2019年10月5日

相关推荐