原文链接: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进行处理,非常感谢!