在 Ubuntu 中安装 Java 112025年3月17日 | 阅读 12 分钟 Java 11 是继 Java 8 之后的第二个长期支持 (LTS) 版本。Oracle JDK 自 Java 11 起将不再免费用于商业用途。我们可以在集成阶段使用它,但需要购买商业使用许可。否则,我们将可能收到 Oracle 的账单。Java 10 是最后一个可以免费下载的 Oracle JDK 版本。 从 2019 年 1 月起,Oracle 停止支持 Java 8。我们将需要付费才能获得更多支持。我们可以继续使用,但将无法获得安全/补丁更新。Oracle 自 Java 11 起将不再为单个 Java 版本提供免费的 LTS 支持。我们可以从 Oracle 或许多其他提供商(如 Red Hat、IBM、Azul、AdoptOpenJDK 等)那里安装 OpenJDK 的构建版本,而 Oracle JDK 则不再免费。 我们应该下载哪个版本的 Java?由于 Oracle 采用了一种发布模式,每 6 个月发布一个新版本,如果我们使用 Oracle 提供的免费 OpenJDK,我们就必须每 6 个月更新一次,因为新版本发布后 Oracle 不会提供免费更新。这对公司来说可能是一个挑战。向 Oracle 支付费用获得支持,然后仅从一个 Java 版本迁移到下一个 LTS 版本。 这样我们就能获得所有更新,Java 11 的支持将持续到 2026 年。我们可以在 2022 年安装 Java 17。即使在支持期限结束后,也可以继续使用免费的 Java 版本。尽管我们不会收到安全更新,但这可能会暴露安全漏洞。Oracle 不会为 Java 10 和 Java 9 提供商业更新或支持。我们需要寻找其他替代构建版本来继续免费使用它们。 Java 11 的特性 - 新的 HTTP 客户端
Java 11 包含一个新的 HTTP 客户端。它已包含在 `java.net.http` 包/模块中,并包含以下主要类和接口- WebSocket 是构建 WebSocket 客户端的入口点。
- HttpResponse 是 HttpRequest 调用返回的结果。
- HttpRequest 是要从 HttpClient 发送的请求。
- HttpClient 是使用该 API 的入口点。
与 Java 中现有的 HTTP 客户端支持 `java.net.HttpURLConnection` 相比,这个新客户端是一个巨大的改进,因为 `java.net.HttpURLConnection` 由于存在许多限制,不适合生产环境使用。 - 更好的代码可读性和更简单的 API: API 使得处理响应和构造请求更容易编写,代码更简洁,更易于理解。使用 Builder 模式而不是 setter 方法也提高了其响应/请求和客户端的线程安全性。
- 与其他 Java API 兼容: 该客户端利用了现代 Java 语言的 API 和特性,如 Optional、Lambda 表达式、标准的日期和时间 API 等。
- 协议支持: 新的 HTTP (HTTP/1.1) 客户端还支持 HTTP/2 和 WebSocket。
- 支持非阻塞 I/O: 该客户端支持运行请求,而不会因为使用异步回调/API 而阻塞线程,这些回调/API 使用 `java.util.concurrent.CompletableFuture`。
- 嵌套类属性的可视性管理
Java 支持在一个源文件中定义多个类,例如嵌套类。尽管如此,从用户的角度来看,它们被视为属于“同一类”。因此,用户期望对它们的属性拥有共享的访问权限。 编译器应通过整合访问桥来支持这些假设,从而允许私有属性在同一个包内的多个类之间进行访问。它们将私有成员的调用合并为目标类中编译器生成的类方法调用,该调用使用推荐的私有成员。 他们还向 `java.lang.Class` 添加了三个方法- boolean isNestmateof (Class)
- Class [] getNestMembers ()
- Class getNestHost ()
- 无操作垃圾收集器 (Epsilon)
在 JDK 11 中,Epsilon GC 是一种新的垃圾收集器。此 GC 处理内存分配,但不执行实际的内存回收机制。因此,当整个 Java 堆用完时,它将通过显示 `OutOfMemoryError` 来停止 JVM。 构建此垃圾收集器的目的是提供最低的可行延迟开销以及有限的内存分配限制,但代价是内存消耗。它定义了堆学习足够我们的应用程序,因此我们不需要 JVM 占用资源来运行 GC 操作。它减少了 GC 对执行的影响,代码执行完全独立。- 主要来说,可以使用 epsilon GC 来测试性能,例如垃圾回收如何影响我们应用程序的性能以及我们应用程序内存的阈值。
- Epsilon GC 对于许多需要实现最后一次延迟改进的应用程序也很有益,尤其是对于那些对超低延迟敏感的应用程序,我们对内存分配有信心,了解应用程序的内存占用,并且 GC 周期可能是一个问题。
- 一个冗长的 GC 周期可能会成为一个问题,因为它会延长故障检测时间,并且在此类应用程序中恢复会最终延迟。在这种情况下,允许负载均衡器发现故障并制定比 GC 周期更好的恢复策略。
- 块、脚本和新字符
与许多 Java 版本相比,Java 11 的一个显著区别是增加了 16,018 个新字符。Java 11 添加了 128 个 emoji 字符和 19 个符号,非常适合比特币符号和新的 4K 电视标准。我们还可以遇到 10 种新脚本和 18 个新块。 Java 11 中的 10 种新脚本是 Nushu、Zanabazar Square、Bhaiksuki、Tangut、Masaram Gondi、Marchen、Osage、Adlam、Soyombo 和 Newa。 10 个块尤其适合这 10 种新脚本,属于新增的 18 个块。另外 8 个新块适用于现有脚本。现有脚本包括 Glagolithic Supplement、Syriac Supplement、CJK Extension F、Kana Extended-A、Punctuations and Ideographic Symbols、Mongolian Supplement、Cyrillic Extended-C 和 Tangut Components。 - Java Flight Recorder
有许多工具可以在开发过程中帮助我们解决和分析问题。然而,某些问题仅在应用程序运行时发生。通常,分析它们是不可能的或非常困难的,因为我们经常无法重现这些错误。 Java Flight Recorder 可以通过在执行时记录 JVM 数据来帮助我们,并将其保存在文件中以供评估。多年来,JFR 一直是 Oracle JDK 的商业功能。它现在成为 OpenJDK 的一部分,可以通过 JDK Enhancement Proposal 328 免费使用。 如何启动 Flight Recorder? 我们可以通过两种方式启动 Flight Recorder。第一种方式是在启动应用程序时使用 Java 终端中的以下选项来启用 Flight Recorder -XX:StartFlightRecorder=filename=<文件名> 第二种方式是使用 `jcmd` 来启用正在运行的 Java 应用程序的 Flight Recorder jcmd JFR.start filename=<文件名> - API 改进
JDK 11 在现有模块中添加了许多新方法和类。下面的列表是一个简短的概述,侧重于似乎很重要的改进。 java.lang.String- java.util.function: 它表示一个函数,该函数接收一个参数并产生一个结果。
- String stripTrailing (): 返回一个删除了末尾空格的字符串。
- String stripLeading (): 返回一个删除了开头空格的字符串。
- string repeat (int): 返回一个将原始字符串自身重复 n 次的字符串。
- String strip (): 返回一个删除了开头和结尾空格的字符串。
- stream lines (): 返回一个从字符串中获取的行流。
- boolean isBlank (): 如果字符串仅由空格组成或为空,则返回 true 或 false。
java.util.function.Predicate- Predicate not (Predicate)。它返回一个 Predicate;它是传递的 Predicate 的否定。
java.lang.CharSequence- int compare (CharSequence, (CharSequence):返回一个 null、正数或负数值。
java.lang.StringBuffer/java.lang.StringBuilder- 现在,类具有 `compareTo()` 方法的权限,该方法接收一个 StringBuilder/StringBuffer 参数。它返回一个 int。比较逻辑遵循与 CharSequence 类的 `new` 方法相同的字典顺序。
- 删除和弃用
此列表说明了已弃用或从 JDK 中删除的每个方面。 移除 CORBA 模块和 Java EE JDK Enhancement Proposal 320 从 JDK 中移除了以下列出的模块- jdk.xml.bind (JAXB 工具)
- jdk.xml.ws (JAX-WS 工具)
- jdk.se.ee (前面解释的六个模块的组合模块)
- java.transaction (JTA)
- java.corba (CORBA)
- java.xml.ws.annotation (基本注解)
- java.activation (JAF)
- java.xml.bind (JAXB)
- java.xml.ws (JAX-WS)
上述技术最初是为 Java EE 环境开发的,并在 Java 6 发布时合并到标准的“Java SE”版本中。在 Java 9 中,它们被标记为“弃用”,最终在 Java 11 中被移除。更新项目后,我们可以将 Java 11 的库重新添加到我们的项目中。- 废弃 Nashorn JavaScript 引擎
JavaScript 引擎“Rhino”在 JDK 8 和 Java 11 中通过 JEP 335 引入。它被标记为“弃用并移除”,并将在后续版本中完全移除。原因是 ECMAScript 的快速发展和 Node.js 引擎。 - 废弃 Pack200 API 和工具
Pack200 是一种独特的压缩技术,在 Java 5 中引入,与标准技术相比,它实现了更好的压缩率,特别适用于 .class 和 .jar 文件。Pack200 在 2000 年代初期节省了大量带宽。该算法很复杂,而且进一步改进的成本与 100 兆比特互联网线路时代的有用性不符。因此,该工具已被标记为“弃用”,并附带 JDK Enhancement Proposal 336,应在某个 Java 版本中移除。 - JavaFX 独立发展
相关的 `javapackager` 和 JavaFX 工具不再随 JDK 11 发布。相反,我们可以获得一个独立的 SDK,可以从 JavaFX 主页下载。
- 其他改进
Unicode 11 支持 Java 11 包含了 Unicode 11 的支持,以改进平台 API。以下是一些主要由 Unicode 10 支持的 Java 类- 在 `java.text` 包中:BreakIterator、Normalizer 和 Bidi
- 在 `java.lang` 包中:Characters 和 String
- 在 `java.awt.font` 包中:NumericShaper
此升级包含 Unicode 9 的修改,并加入了 16,018 个字符和 10 种新脚本。 改进的 KeyStore 机制 Java 11 可能会影响 Java 12 的安全特性。在 Java 11 中,改进的 KeyStore 机制可以证明这一点。我们可以在 Java 11 中找到一个新的安全属性“jceks.key.serialFilter”。JCEKS KeyStore 用户可以在反序列化位于 SecretKeyEntry 中的加密密钥对象时使用此安全过滤器。过滤器的结果会返回一个 UNDECIDED 值,并在没有配置的情况下通过 'jdk.serialFilter' 提供默认配置。 低开销堆草图 Java 11 通过 JVMTI 提供了一种低开销的 Java 堆分配采样技术。此技术的概念非常适合专注于特定目标。低开销首先达到了默认激活的满意阶段。下一个有用之处是提供有关活动和非活动 Java 对象的数据。此外,JVMTI 是一个可编程且定义明确的接口,可提供轻松访问。此外,我们将低开销堆草图视为 Java 12 特性的一些可能改进。 改进的 Aarch64 本征函数 编译器以一些独特的方式管理本征函数。它们通过特定于 CPU 体系结构的汇编代码来提高性能。Java 11 改进并优化了 AArch64 处理器上的数组和字符串本征函数。Java 11 还为 `java.lang` 的 sin、log 和 cos 方法合并了新的本征函数。 - Java 11 的长期支持
我们可以在多个开发阶段使用 Java 11。Java 11 的最新商业使用特性需要许可。在 Java 11 发布后,许多重要信息浮出水面。 例如,Oracle 不会在 2019 年后提供 Java 8 支持。我们可以通过付费继续使用 Java 8 支持,尽管我们不会获得任何安全和补丁更新。我们可以下载 OpenJDK 的构建版本,因为我们不能免费使用 Oracle JDK。 各种提供商提供灵活的选项,我们可以通过这些提供商使用 OpenJDK 的构建版本,并在需要时进行更新。每个人都可以使用 OpenJDK 11,而且它是免费的。2018 年 9 月 25 日,Java 11 发布了自六个月发布周期以来首个 JDK LTS 版本。多年来,LTS 定义了 Oracle 将为该版本提供安全补丁。最后一个 LTS 版本是 Java 8。Java 10 和 Java 9 不是 LTS 版本,这意味着这些版本的支持已随所有后续版本一起被放弃。
Java 11 的其他一些重要特性如下 - Flight Recorder (JEP 328)
- 从文件中读写字符串
- HTTP 客户端 (JEP 321)
- 嵌套基于访问控制
- Lambda 参数的局部变量
- String 类中的新实用方法
- 使用一个命令执行 Java 文件
如何在 Ubuntu 中安装 Java 11?Java 语言是世界上最受欢迎的编程语言之一。它也是一种面向对象、通用、面向类和多用途的编程语言,因其实现依赖性较小的结构而闻名,这意味着 Java 的编译代码可以在支持 Java 的任何平台上执行,而无需重新编译。 此外,Java 可靠、安全且快速。它广泛用于开发移动设备、科学超级计算机、游戏机、数据中心、笔记本电脑等上的 Java 应用程序。它还可以用于创建桌面和服务器应用程序,并且 Java 几乎可以在所有操作系统上运行,包括 Linux、Windows 和 macOS。Java 中指定的软件可以在创建 Java 的任何系统上进行编译和执行。这个多功能环境可用于创建从软件到常见 Web 应用程序的任何内容。OpenJDK 是 Java SE(Oracle Java 标准版)开发工具包的开源免费实现。 Java SE 和 OpenJDK 等同于 JDK,它添加了一个 JRE(Java 运行时环境)和用于开发和编译 Java 应用程序的工具。虽然有几个 OpenJDK 版本可用,但 11 版本是最新的 LTS 版本。因此,推荐使用 OpenJDK 11 来开发生产应用程序。 重要修改 - 由于部署堆栈的不可用性,已从支持的配置列表中删除了所有支持的浏览器。
- 已从 macOS 和 Windows 的 JRE 安装中删除了自动更新功能。
- 现在,Java Mission Control 和 JavaFX 可作为独立下载提供。
开始之前 Java 有几种不同的实现。Oracle Java 和 OpenJDK 是 Java 的两个主要实现,它们彼此几乎相同,除了 Oracle Java 具有一些额外的商业特性。Oracle Java 许可证仅允许非商业软件使用,例如开发使用和个人使用。 默认的 20.04 Ubuntu 存储库包含两个 OpenJDK 包:**Java Development Kit** 和 **Java Runtime Environment**。Java Runtime Environment 包含二进制文件、类和 Java 虚拟机,允许我们执行 Java 程序。Java Development Kit 包含库、调试/开发工具以及创建 Java 应用程序所需的 Java Runtime Environment。 如果您不确定要安装哪个 Java 包,通常的建议是安装 11 版本(默认 OpenJDK)。一些基于 Java 的应用程序可能需要特定的 Java 版本,因此您应该查看应用程序文档。在本文中,我们将讨论如何在 Ubuntu 中安装 Oracle JDK 11。 在 Ubuntu 中下载 Oracle JDK 11Oracle JDK 11 不在官方 Ubuntu 包存储库中。但我们可以从 Oracle 官方网站轻松下载并将其安装在 Ubuntu 中。我们需要首先访问以下链接查看 Java SE 的官方网站 https://www.oracle.com/technetwork/java/javase/overview/index.html页面加载后,我们将选择 **“Downloads”**,如下面的屏幕截图所示  我们将从 **Java SE 11.x (LTS)** 部分选择 **DOWNLOAD**,如下面的屏幕截图所示  通过向下滚动一点,我们将选择 **“Accept License Agreement”** 选项,如下面的屏幕截图所示  对于 Oracle Java 标准版,我们已获得 **Oracle Technology Network License Agreement**;我们可以继续下载 Oracle JDK 11。按下 DEB 文件链接以下载 Ubuntu 中的 Oracle JDK 11,如下面的屏幕截图所示  浏览器应该会要求我们存储 Oracle JDK 11 的 DEB 软件包文件。选择 **“Save File”** 选项,然后按 **OK** 按钮。  我们的下载过程应该会开始。可能需要一些时间才能完成。  安装 Oracle JDK 11下载完成后,我们将使用浏览器存储 DEB 软件包文件的目录。通常是 ~/Downloads 目录,位于我们的 HOME 目录中。 重要提示:软件包文件的名称可能会有所不同。请确保用您自己的文件名替换文件名。 现在,我们可以使用以下命令安装 Oracle JDK 11 版本 现在,我们将输入登录用户的密码,然后单击 **Enter** 按钮。Oracle JDK 11 已成功安装在我们的 Ubuntu 系统中。 
|