编程工具

关注公众号 jb51net

关闭
Java SE Development Kit(JDK) 17.0.16 官方正式版 Win64

Java SE Development Kit(JDK) 17.0.16 官方正式版 Win64

您还可以选择:官方全版本下载官方全版本下载

热门排行

简介

Java SE Development Kit(JDK) 17.0.16 官方正式版 Win64

Java 17 LTS 是 Java SE 平台的最新长期支持版本。 根据 Oracle 免费条款和条件许可,JDK 17 二进制文件可在生产中免费使用,并可免费重新分发。JDK 17 将根据这些条款接收更新,至少在 2024 年 9 月之前。JDK 是使用 Java 编程语言构建应用程序和组件的开发环境。JDK 包括用于开发和测试用 Java 编程语言编写并在 Java 平台上运行的程序的工具。本次提供的是Java SE Development Kit(JDK) 17 for Windows官方版本下载,欢迎需要此款工具的朋友前来下载使用。

JDK17新特性详解

 预览版:该功能在当前版本可以使用,如果效果不是很好的话,可能以后的其他版本就会删去该功能。

最终版:该功能在之前版本效果很好,之后的每个版本中都会存在该功能。

1、switch新增模式(预览版)

使用 switch 表达式和语句的模式匹配以及对模式语言的扩展来增强 Java 编程语言。将模式匹配扩展到 switch 允许针对多个模式测试表达式,每个模式都有特定的操作,以便可以简洁安全地表达复杂的面向数据的查询。基于JDK16 instanceof模式匹配(最终版)优化升级switch使用方法,先回忆下JDK16模式匹配(最终版)

if (obj instanceof String s) {
// 直接使用 s拼接字符串
s += "heihei";
} else if (obj instanceof Integer i){
// 直接使用i进行整型逻辑运算
i += 1;
}

switch可直接用instanceof模式匹配选择(需要提前考虑null判断)

Object o;
switch (o) {
case null -> System.out.println("首先判断对象是否为空,走空指针逻辑等后续逻辑");
case String s -> System.out.println("判断是否为字符串,s:" + s);
case record p -> System.out.println("判断是否为Record类型: " + p.toString());
case int[] arr -> System.out.println("判断是否为数组,展示int数组的长度" + ia.length);
case Integer i -> System.out.println("判断是否为Intger对象,i:" + i);
case Student s -> System.out.println("判断是否为具体学生对象,student:" + s.toString());
case UserCommonService -> System.out.println("判断是否为普通用户实现类,然后走普通用户逻辑");
case UserVipService -> System.out.println("判断是否为vip用户实现类,然后走vip用户逻辑");
default -> System.out.println("Something else");
}

2、Realed class密封类(最终版)

密封类和接口限制哪些其他类或接口可以扩展或实现它们。

public sealed interface Shape{
final class Planet implements Shape {}
final class Star implements Shape {}
final class Comet implements Shape {}
}
public abstract sealed class Test{
final class A extends Test {}
final class B extends Test {}
final class C extends Test {}
}

3、随机数增强

为伪随机数生成器 (PRNG) 提供新的接口类型和实现,包括可跳转的 PRNG 和额外的一类可拆分 PRNG 算法 (LXM)。

4、浮点运算更加严格

简化数字敏感库开发,包括java.lang.Math和java.lang.StrictMath(对开发无实际意义)

5、Parallel GC 默认启用

Parallel GC 默认启用自适应并行处理,并行GC确定java.lang.ref.Reference在垃圾收集期间用于处理实例的最佳线程数。

默认-XX:ParallelRedProcEnabled: true。在有多个线程可用于垃圾收集的机器上,明显改善了垃圾收集暂停的阶段,如果遇到垃圾收集暂停增加的情况,可以通过-XX:ParallelRedProcEnabled在命令行上指定到原始行为

6、增强TreeMap

增强JDK-8176894(TreeMap 没有对 putIfAbsent()、computeIfAbsent()、computeIfPresent()、compute() 方法的专门实现。默认实现经常导致两次树遍历,这会损害性能)

7、弃用Socket实现工厂机制

弃用并最终删除用于为java.net 包中的套接字类型静态配置系统范围工厂 的 API 点

具体如下:

* 方法:
static void ServerSocket.setSocketFactory (SocketImplFactory fac)
static void Socket.setSocketImplFactory (SocketImplFactory fac)
static void DatagramSocket.setDatagramSocketImplFactory (DatagramSocketImplFactory fac)

* Types
java. net SocketImplFactory
java.net DatagramSocketImplFactory

也可以弃用java.net SocketImplFactory 和 DatagramSocketImplFactory 类型 ,因为它们的唯一用途与上述工厂有关 设置方法。

8、统一日志支持异步日志刷新

为了避免在使用统一日志的线程中出现不希望的延迟,用户现在可以请求统一日志系统以异步模式运行。通过传递命令行选项来完成的-Xlog:async。在异步日志模式下,日志站点将所有日志消息排入缓冲区。独立线程负责将它们刷新到相应的输出。中间缓冲区是有界的。缓冲区耗尽时,将丢弃排队消息。可以使用命令行选项控制中间缓冲区的大小-XX:AsyncLogBufferSize=<bytes>。

9、新增 java.time.InstantSource

java.time.InstantSource引入了一个新界面。这个接口是一个抽象java.time.Clock,只关注当前时刻,不涉及时区。

10、javadoc工具

新的“新 API”页面和改进的“弃用”页面,JavaDoc 现在可以生成一个页面,总结最近 API 的变化。要包含的最新版本列表是使用--since命令行选项指定的。这些值用于查找@since要包含在新页面上的具有匹配标签的声明。该--since-label命令行选项提供了“新API”页面的标题文本使用。

Java SE Development Kit 17安装教程

1、在本站下载并解压缩后,双击“jdk-17_windows-x64_bin.exe”,根据安装向导提示,选择“下一步”

Java 17下载

2、默认安装在C盘,继续“下一步”

Java 17下载

3、正在安装,稍等片刻即可,中途不要关闭电脑

Java 17下载

4、好了,到这里Java SE Development Kit 17就安装完成啦

Java 17下载

安装 JDK 17 和 JRE 8 时修复 Shim 情况

当您安装 JDK 17,然后安装 JRE 8,然后运行该 java -version命令时,1.8.0输出中显示的是17。这是因为 javapath位于用户环境路径中 JDK 17 位置之前。

这是 JRE 8 安装程序的一个错误。要解决此填充程序的情况,请卸载并重新安装 JDK 17。

JDK安装疑难解答

解压期间系统错误

如果您看到错误消息:system error during decompression,则包含该TEMP目录的磁盘上可能没有足够的空间。

程序无法在 DOS 模式下运行

如果您看到错误消息:This program cannot be run in DOS mode,请执行以下操作:

打开 MS-DOS 外壳程序或命令提示符窗口。

右键单击标题栏。

选择属性。

选择程序选项卡。

单击高级。

确保未选中防止基于 MS-DOS 的程序检测 Windows 项。

选择确定。

再次选择确定。

退出 MS-DOS 外壳。

重启你的电脑。

不属于系统代码页的字符

如果安装目录不是系统区域设置代码页的一部分,则可能会出现 1722 错误。为防止出现这种情况,请确保用户和系统区域设置相同,并且安装路径仅包含作为系统区域设置代码页一部分的字符。可以在区域选项或区域设置控制面板中设置用户和系统区域设置。

相关的错误编号是 4895647。

在 JDK 卸载失败后清理注册表

有时,尝试通过 Windows添加/删除程序卸载 JDK 会 在注册表中留下一些未完全删除的 Java 条目。这些遗留的注册表项可能会导致安装新版本 Java 时出现问题。以下是清理注册表项的方法:

程序安装和卸载疑难解答(推荐方法)

手动注册表编辑

程序安装和卸载疑难解答(推荐方法)

运行程序安装和卸载疑难解答来修复损坏的注册表项,这些注册表项会阻止程序完全卸载或阻止新的安装和更新。

手动编辑注册表(仅当 Fix It 实用程序不起作用时才使用此功能)

错误地编辑您的注册表可能会严重损坏您的系统。在更改注册表之前,您应该从您的计算机备份任何有价值的数据。

使用File->Export注册表编辑器的功能在删除之前保存注册表项。如果您删除了错误的注册表项,您可以使用该File->Import功能从保存的备份文件中恢复注册表。

要删除注册表项:

确定正确的注册表项。请参阅查找 JDK 注册表项和 UninstallString 值。

突出显示该键,右键单击并选择 Delete。

出现提示时单击是。

JDK 被卸载。

在 Windows 上卸载 JDK

要卸载 JDK 17,请使用Microsoft Windows控制面板中的添加/删除程序实用程序。

在静默模式下卸载 JDK

您可以使用命令行卸载 JDK。

使用以下命令以静默模式卸载JDK:

MsiExec.exe/X{<UninstallString>}

例如,要卸载 JDK 15,请运行以下命令:

MsiExec.exe /X{E04E5624-3CF1-5E84-A439-4D8FAAA05C79}

更新日志

Java™ SE 开发工具包 17,更新 17.0.16 (JDK 17.0.16)
7月 15, 2025

此更新版本的完整版本字符串是 17.0.16+12(其中“+”表示“生成”)。 版本号为 17.0.16。此 JDK 符合 Java SE 规范 17.1 版 (JSR 392 MR 1 2024-07-02)。

IANA TZ 数据 2025b
JDK 17.0.16 包含 IANA 时区数据 2025b,其中包含以下更改:

智利艾森地区的新区域,从 -04/-03 移至 -03。
有关详细信息,请参阅 JRE 软件中的时区数据版本。

安全基线

下表指定了 JDK 17.0.16 发布时 Java 运行时的安全基线:

Java 系列版本    安全基线(完整版本字符串)
17    17.0.16+12
11    11.0.28+12
8    1.8.0_461-b11

使 JDK 保持最新状态

Oracle 建议在每次关键补丁更新时更新 JDK。 为了确定某个版本是否是最新版本,“安全基线”页面可以 用于确定每个版本系列的最新版本。

包含安全漏洞修复的关键补丁更新会提前一年公布 关键补丁更新、安全警报和公告。 不建议在计划的下一个关键补丁更新之后使用此 JDK(版本 17.0.16) 2025 年 10 月 21 日。

Java 管理服务可供所有用户使用,可以帮助您在系统中查找易受攻击的 Java 版本。在 Oracle Cloud 中运行的 Java SE 订阅者和客户可以使用 Java 管理服务来更新 Java 运行时并执行进一步的安全审查,例如识别 Java 程序使用的潜在易受攻击的第三方库。现有 Java 管理服务用户单击此处登录您的仪表板。Java Management Service 文档提供了对所有人可用的功能列表,以及仅对客户可用的功能。了解有关使用 Java Management Service 监视和保护 Java 安装的更多信息。

删除的功能和选项

security-libs/java.security
➜ 在到期日期后删除了 Baltimore CyberTrust 根证书 (JDK-8303770)

以下过期的根证书已从密钥库中删除:cacerts

+ alias name "baltimorecybertrustca [jdk]"

  Distinguished Name: CN=Baltimore CyberTrust Root, OU=CyberTrust, O=Baltimore, C=IE

security-libs/java.security
➜ 删除了两个 Camerfirma 根证书 (JDK-8350498)

以下已终止且不再使用的根证书已从密钥库中删除:cacerts

+ alias name "camerfirmachamberscommerceca [jdk]"

  Distinguished Name: CN=Chambers of Commerce Root, OU=http://www.chambersign.org, O=AC Camerfirma SA CIF A82743287, C=EU

+ alias name "camerfirmachambersignca [jdk]"
  Distinguished Name: CN=Global Chambersign Root - 2008, O=AC Camerfirma S.A., SERIALNUMBER=A82743287, L=Madrid (see current address at www.camerfirma.com/address), C=EU

其他说明

security-libs/java.security
➜ 添加了 4 个来自 Sectigo Limited 的新根证书 (JDK-8359170)

以下根证书已添加到 cacerts 信任库中:

+ Sectigo Limited

  + sectigocodesignroote46
    DN: CN=Sectigo Public Code Signing Root E46, O=Sectigo Limited, C=GB

+ Sectigo Limited
  + sectigocodesignrootr46
    DN: CN=Sectigo Public Code Signing Root R46, O=Sectigo Limited, C=GB

+ Sectigo Limited
  + sectigotlsroote46
    DN: CN=Sectigo Public Server Authentication Root E46, O=Sectigo Limited, C=GB

+ Sectigo Limited
  + sectigotlsrootr46
    DN: CN=Sectigo Public Server Authentication Root R46, O=Sectigo Limited, C=GB

安装/安装

➜ 使用 OL9 签名密钥对 oracle.com JDK RPM 包进行签名 (JDK-8351906(非公开))
oracle.com 个旨在直接下载到目标系统的 JDK RPM 包现在使用 OL9 签名密钥而不是 OL8 签名密钥进行签名。托管在 YUM 存储库上的 RPM 包仍使用目标存储库的相应密钥进行签名。

core-libs/javax.naming
➜ 更新 com.sun.jndi.ldap.object.trustSerialData 系统属性的默认值 (JDK-8290367)

在此版本中,默认情况下,LDAP 提供程序的 JDK 实现不再支持 Java 对象的反序列化:

系统属性的默认值已更新为 。com.sun.jndi.ldap.object.trustSerialDatafalse
从 LDAP 上下文对 Java 对象进行透明反序列化现在需要显式选择加入。依赖于 LDAP 属性重建 Java 对象或 RMI 存根的应用程序需要将系统属性设置为 。com.sun.jndi.ldap.object.trustSerialDatatrue

security-libs/jdk.security
➜ 如果删除了条目,Jarsigner 应打印警告 (JDK-8309841)

如果从已签名的 JAR 文件中删除了某个条目,则没有机制可以检测该条目是否已使用 API 被删除,因为该方法返回的就好像该条目从未存在过一样。通过此更改,该命令会分析签名文件,如果某些部分没有匹配的文件条目,它会打印出以下警告:“此 JAR 包含不存在的文件的签名条目”。用户可以通过向命令添加选项来进一步查找这些条目的名称。JarFilegetJarEntrynulljarsigner -verify-verbose

错误修复

此版本还包含针对 Oracle 关键补丁更新中描述的安全漏洞的修复。

➜ 17.0.16 中修复的问题:

#    JBS公司    元件    总结
1    JDK-8348597    客户端库/2d    将 HarfBuzz 更新到 10.4.0
2    JDK-8348596    客户端库/2d    将 FreeType 更新到 2.13.3
3    JDK-8348600    客户端库/java.awt    将 PipeWire 更新到 1.3.81
4    JDK-8348598    客户端库/java.awt    将 Libpng 更新至 1.6.47
5    JDK-8280468    客户端库/java.awt    Linux 上的 getConfigColormap、getConfigVisualId、XVisualIDFromVisual 崩溃
6    JDK-8286447    客户端库/java.awt    [Linux]如果未安装 headful AWT 库,则 AWT 应以无头模式启动
7    JDK-8280991    客户端库/java.awt    [XWayland]setDisplayMode 调用后没有 displayChanged 事件
8    JDK-8286204    客户端库/javax.accessibility    [辅助功能,macOS,旁白]当用户在 macOS 上首次迭代到 10 时,VoiceOver 会将微调器值 10 读取为 1
9    JDK-8345728    客户端库/javax.accessibility    [辅助功能,macOS,屏幕放大镜]:JCheckbox 未选中状态不放大,但适用于选中状态
10    JDK-8348936    客户端库/javax.accessibility    [辅助功能,macOS,旁白]VoiceOver 不会宣布在 macOS 上使用“空格”键切换复选框时取消选中
11    JDK-8266435    客户端库/javax.imageio    WBMPImageReader.read() 不应截断输入流
12    JDK-6928542    客户端库/javax.swing    RTF 中的汉字不被解码
13    JDK-8224267    客户端库/javax.swing    带有 5000+ 换行符的 JOptionPane 消息字符串产生 StackOverflowError
14    JDK-8318915    核心库/java.math    增强 BigDecimal.toPlainString() 中的检查
15    JDK-8344589    核心库/java.util:i18n    将 IANA 语言子标记注册表更新至版本 2024-11-19
16    JDK-8356096    核心库/java.util:i18n    ISO 4217 修正案 179 更新
17    JDK-8299858    core-svc/java.lang.management    [指标]交换内存限制过大时报告错误
18    JDK-8297173    core-svc/java.lang.management    usageTicks 和 totalTicks 应该是易失性的,以确保不同的线程获得最新的 tick
19    JDK-8345296    热点/编译器    AArch64:不允许 prctl 时,虚拟机与 SIGILL 崩溃
20    JDK-8357105    热点/编译器    C2:编译失败,并显示“assert(false) failed: opty program during loop optimization detected empty program”
21    JDK-8339148    热点/运行时    将 os::Linux::active_processor_count() 公开
22    JDK-8300645    热点/运行时    处理GET_CONTAINER_INFO宏日志记录中的 julong 值
23    JDK-8300658    热点/运行时    memory_and_swap_limit() 在 swapAccount=0 的系统上报告错误的值
24    JDK-8311546    security-libs/java.security    证书名称约束未正确验证前导句点

大家还下载了