Java开发指南:JDK21下载、安装及目录解析,轻松开启编程之旅
大家好,我是袁庭新。如果我们要开发或运行Java应用程序,就需要下载并安装JDK。
JDK 21是Java SE平台的最新长期支持版本。根据甲骨文无费用条款和条件(NFTC),JDK 21二进制文件可免费在生产中使用,并可免费重新分发。JDK 21将在NFTC下收到更新,直到下一个LTS发布一年后的2026年9月。随后的JDK 21更新将根据Java SE OTN许可证(OTN)获得许可,超出OTN许可证有限免费授予的生产使用将需要付费。
Oracle公司提供了多种操作系统的JDK,不同操作系统的JDK在使用上基本类似,初学者可以根据自己使用的操作系统,从Oracle官方网站下载相应的JDK安装文件。
1.访问Oracle官方网站https://www.oracle.com/java/technologies/downloads/#java21,下载JDK 21的安装包。
2.如果是Windows系统,在窗口中切换到“Windows”选项,下载“x64 Installer”版本的即可。如下图所示。
3.如果是macOS系统,在窗口中切换到“macOS”选项,根据自己的Mac芯片类型,选择M芯片或者Intel芯片的版本进行下载。如下图所示。
您必须具有管理员权限才能在Microsoft Windows上安装JDK。
1.通过双击下载位置的安装程序图标或文件名来启动JDK 21安装程序。
2.按照安装程序提供的说明进行操作。
以上3个功能模块进行说明:开发人员可以根据自己的需求选择所要安装的模块,本教程选择\”开发工具\”模块。
- 开发工具:JDK中的核心功能模块,包含一系列可执行程序,如javac.exe、java.exe等,还包含一个专用的JRE环境。
- 源代码:Java提供公共API类的源代码。
- 公共JRE:Java程序的运行环境。由于开发工具中已经包含了一个JRE,因此没有必要再安装公共的JRE环境,此项可以不做选择。
3.安装完成后,删除下载的文件以恢复磁盘空间。
注意:在安装期间,以下文件将复制到您的计算机。
或者,您可以直接从JDK的bin目录运行这些可执行文件。
JDK安装在/Program Files/Java/jdk-<FEATURE>中,其中<FEATURE>是功能发布号。例如,JDK 21.0.2安装在/Program Files/Java/jdk-21中。
JDK支持基于Intel(x64)和Apple Silicon(AArch64)的Mac计算机。下面我们来介绍如何在macOS上安装JDK。
1.从浏览器下载窗口或文件列表中,双击.dmg文件以启动它。出现一个Finder窗口,其中包含打开框的图标和.pkg文件的名称。
2.双击JDK 21.0.2.pkg图标以启动安装应用程序。安装应用程序显示简介窗口。
3.在上图中点击【继续】按钮,出现目的卷宗窗口,选择将JDK为这台电脑上的所有用户安装。
4.在上图中点击【继续】按钮,出现安装类型窗口,显示消息的窗口保持默认即可,然后点击【安装】按钮进行软件的安装。
5.在上述窗口中点击【安装】按钮后,安装器提示正在尝试安装新软件,点击【使用密码…】按钮。
6.在安装器窗口中,输入管理员用户名和密码(Mac开机的用户名和密码),然后单击【安装软件】按钮。
7.开始软件安装,JDK安装成功后,并显示一个确认窗口,点击【关闭】按钮即可。
JDK安装软件后,如果您想节省磁盘空间,您可以删除.dmg或.tar.gz文件。JDK安装在/Library/Java/JavaVirtualMachines/jdk-<FEATURE>.jdk中,其中<FEATURE>是功能发布号。例如,JDK 21.0.2安装在/Library/Java/JavaVirtualMachines/jdk-21.jdk中。
JDK安装完毕,会在磁盘上生成一个目录,该目录被称为JDK目录。为了更好地学习JDK,初学者必须要对JDK目录下各个子目录的意义和作用有所了解。下面对JDK目录下的子目录进行介绍。
1.bin目录:该目录用于存放一些可执行程序,如javac.exe(Java编译器)、java.exe(Java运行工具)、jar.exe (打包工具)和javadoc.exe(文档生成工具)等。
- javac.exe是Java编译器,它可以将编写好的Java文件编译成Java字节码文件(可执行的Java程序)。Java源文件的扩展名为.java,如HelloWorld.java。编译后生成对应的Java字节码文件,字节码文件的扩展名为.class,如HelloWorld.class。
- java.exe是Java运行工具,它会启动一个Java虚拟机(JVM)进程,Java虚拟机相当于一个虚拟的操作系统,专门负责运行由Java编译器生成的字节码文件(.class文件)。
2.db目录:db目录是一个小型的数据库。从JDK 6开始,Java中引入如了一个新的成员JavaDB,这是一个纯Java实现、开源的数据库管理系统。这个数据库不仅简便,而且支持JDBC 4所有的规范,在学习JDBC时,不需要额外安装数据库软件,选择直接使用JavaDB即可。
3.jre目录:jre是Java Runtime Environment的缩写,意为Java程序运行时的环境。该目录是Java运行时环境的根目录,它包含Java虚拟机、运行时的类包、Java应用启动器和一个bin目录,但不包含开发环境中的开发工具。
4.include目录:由于JDK是使用C和C++开发的,因此在启动时需要引人一些C语言的头文件,该目录就是用于存放这些头文件的。
5.lib目录:lib 是library的缩写,意为Java类库或库文件,是开发工具使用的归档包文件。
6.src.zip文件与javafx-src.zip文件:这两个文件中放置的是JDK核心类的源代码和JavaFX源代码,通过这两个文件可以查看Java基础类的源代码。
本文主要介绍了 JDK 21 的下载、安装及目录相关知识。JDK 21 是 Java SE 平台最新长期支持版,在甲骨文 NFTC 下可免费用于生产及再分发至 2026 年 9 月,后续更新依 OTN 许可证管理。下载时,Windows 系统选“x64 Installer”,macOS 按芯片类型选相应版本。安装方面,Windows 需管理员权限,依提示操作并选“开发工具”模块;macOS 双击.dmg 文件后按流程安装。安装完成后,JDK 会生成目录,如 bin 存放可执行程序,db 是小型数据库,jre 是运行环境,include 放 C 头文件,lib 是类库,src.zip 等含源代码。
用 Java 训练深度学习模型,原来能这么简单
本文适合有 Java 基础的人群
作者:DJL-Keerthan&Lanking
HelloGitHub 推出的《讲解开源项目》 系列。这一期是由亚马逊工程师:Keerthan Vasist,为我们讲解 DJL(完全由 Java 构建的深度学习平台)系列的第 4 篇。
很长时间以来,Java 都是一个很受企业欢迎的编程语言。得益于丰富的生态以及完善维护的包和框架,Java 拥有着庞大的开发者社区。尽管深度学习应用的不断演进和落地,提供给 Java 开发者的框架和库却十分短缺。现今主要流行的深度学习模型都是用 Python 编译和训练的。对于 Java 开发者而言,如果要进军深度学习界,就需要重新学习并接受一门新的编程语言同时还要学习深度学习的复杂知识。这使得大部分 Java 开发者学习和转型深度学习开发变得困难重重。
为了减少 Java 开发者学习深度学习的成本,AWS 构建了 Deep Java Library (DJL),一个为 Java 开发者定制的开源深度学习框架。它为 Java 开发者对接主流深度学习框架提供了一个桥梁。
在这篇文章中,我们会尝试用 DJL 构建一个深度学习模型并用它训练 MNIST 手写数字识别任务。
在我们正式开始之前,我们先来了解一下机器学习和深度学习的基本概念。
机器学习是一个通过利用统计学知识,将数据输入到计算机中进行训练并完成特定目标任务的过程。这种归纳学习的方法可以让计算机学习一些特征并进行一系列复杂的任务,比如识别照片中的物体。由于需要写复杂的逻辑以及测量标准,这些任务在传统计算科学领域中很难实现。
深度学习是机器学习的一个分支,主要侧重于对于人工神经网络的开发。人工神经网络是通过研究人脑如何学习和实现目标的过程中归纳而得出一套计算逻辑。它通过模拟部分人脑神经间信息传递的过程,从而实现各类复杂的任务。深度学习中的“深度”来源于我们会在人工神经网络中编织构建出许多层(layer)从而进一步对数据信息进行更深层的传导。深度学习技术应用范围十分广泛,现在被用来做目标检测、动作识别、机器翻译、语意分析等各类现实应用中。
你可以用如下的 gradle 配置来引入依赖项。在这个案例中,我们用 DJL 的 api 包 (核心 DJL 组件) 和 basicdataset 包 (DJL 数据集) 来构建神经网络和数据集。这个案例中我们使用了 MXNet 作为深度学习引擎,所以我们会引入 mxnet-engine 和 mxnet-native-auto 两个包。这个案例也可以运行在 PyTorch 引擎下,只需要替换成对应的软件包即可。
NDArray 是 DJL 存储数据结构和数学运算的基本结构。一个 NDArray 表达了一个定长的多维数组。NDArray 的使用方法类似于 Python 中的 numpy.ndarray。
NDManager 是 NDArray 的老板。它负责管理 NDArray 的产生和回收过程,这样可以帮助我们更好的对 Java 内存进行优化。每一个 NDArray 都会是由一个 NDManager 创造出来,同时它们会在 NDManager 关闭时一同关闭。
NDManager 和 NDArray 都是由 Java 的 AutoClosable 构建,这样可以确保在运行结束时及时进行回收。想了解更多关于它们的用法和实践,请参阅我们前一期文章:DJL 之 Java 玩转多维数组,就像 NumPy 一样
在 DJL 中,训练和推理都是从 Model class 开始构建的。我们在这里主要讲训练过程中的构建方法。下面我们为 Model 创建一个新的目标。因为 Model 也是继承了 AutoClosable 结构体,我们会用一个 try block 实现:
MNIST(Modified National Institute of Standards and Technology)数据库包含大量手写数字的图,通常被用来训练图像处理系统。DJL 已经将 MNIST 的数据集收录到了 basicdataset 数据集里,每个 MNIST 的图的大小是 28 x 28。如果你有自己的数据集,你也可以通过 DJL 数据集导入教程来导入数据集到你的训练任务中。
这段代码分别制作出了训练和验证集。同时我们也随机排列了数据集从而更好的训练。除了这些配置以外,你也可以添加对于图片的进一步处理,比如设置图片大小,对图片进行归一化等处理。
当你的数据集准备就绪后,我们就可以构建神经网络了。在 DJL 中,神经网络是由 Block(代码块)构成的。一个 Block 是一个具备多种神经网络特性的结构。它们可以代表 一个操作, 神经网络的一部分,甚至是一个完整的神经网络。然后 Block 可以顺序执行或者并行。同时 Block 本身也可以带参数和子 Block。这种嵌套结构可以帮助我们构造一个复杂但又不失维护性的神经网络。在训练过程中,每个 Block 中附带的参数会被实时更新,同时也包括它们的各个子 Block。这种递归更新的过程可以确保整个神经网络得到充分训练。
当我们构建这些 Block 的过程中,最简单的方式就是将它们一个一个的嵌套起来。直接使用准备好 DJL 的 Block 种类,我们就可以快速制作出各类神经网络。
根据几种基本的神经网络工作模式,我们提供了几种 Block 的变体。SequentialBlock 是为了应对顺序执行每一个子 Block 构造而成的。它会将前一个子 Block 的输出作为下一个 Block 的输入 继续执行到底。与之对应的,是 ParallelBlock 它用于将一个输入并行输入到每一个子 Block 中,同时将输出结果根据特定的合并方程合并起来。最后我们说一下 LambdaBlock,它是帮助用户进行快速操作的一个 Block,其中并不具备任何参数,所以也没有任何部分在训练过程中更新。
我们来尝试创建一个基本的 多层感知机(MLP)神经网络吧。多层感知机是一个简单的前向型神经网络,它只包含了几个全连接层 (LinearBlock)。那么构建这个网络,我们可以直接使用 SequentialBlock。
当然 DJL 也提供了直接就可以拿来用的 MLP Block :
当我们准备好数据集和神经网络之后,就可以开始训练模型了。在深度学习中,一般会由下面几步来完成一个训练过程:
- 初始化:我们会对每一个 Block 的参数进行初始化,初始化每个参数的函数都是由 设定的 Initializer 决定的。
- 前向传播:这一步将输入数据在神经网络中逐层传递,然后产生输出数据。
- 计算损失:我们会根据特定的损失函数 Loss 来计算输出和标记结果的偏差。
- 反向传播:在这一步中,你可以利用损失反向求导算出每一个参数的梯度。
- 更新权重:我们会根据选择的优化器(Optimizer)更新每一个在 Block 上参数的值。
DJL 利用了 Trainer 结构体精简了整个过程。开发者只需要创建 Trainer 并指定对应的 Initializer、Loss 和 Optimizer 即可。这些参数都是由 TrainingConfig 设定的。下面我们来看一下具体的参数设置:
- TrainingListener:这个是对训练过程设定的监听器。它可以实时反馈每个阶段的训练结果。这些结果可以用于记录训练过程或者帮助 debug 神经网络训练过程中的问题。用户也可以定制自己的 TrainingListener 来对训练过程进行监听。
当训练器产生后,我们可以定义输入的 Shape。之后就可以调用 fit 函数来进行训练。fit 函数会对输入数据,训练多个 epoch 是并最终将结果存储在本地目录下。
这就是训练过程的全部流程了!用 DJL 训练是不是还是很轻松的?之后看一下输出每一步的训练结果。如果你用了我们默认的监听器,那么输出是类似于下图:
当训练结果完成后,我们可以用刚才的模型进行推理来识别手写数字。
在这个文章中,我们介绍了深度学习的基本概念,同时还有如何优雅的利用 DJL 构建深度学习模型并进行训练。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。