源本科技 | 码上会

Java 中的 JDK

2025/12/22
51
0

引言

Java Development Kit(JDK)是一个跨平台的软件开发工具包,提供了构建基于 Java 的应用程序和小程序(applets)所需的全套工具与库。它是 Java 开发环境的核心组成部分,与 Java 虚拟机(JVM)和 Java 运行时环境(JRE)协同工作

  • 包含完整的开发工具链:如编译器(javac)、调试器(jdb)、文档生成工具(javadoc)、打包工具(jar)等,满足从编写、编译到调试和部署的全流程需求

  • 内嵌 JRE:JDK 自带 JRE,因此安装 JDK 后,既能开发也能直接运行 Java 程序

  • 跨平台支持:虽然 JDK 本身有针对不同操作系统的版本(如 Windows、macOS、Linux),但其生成的字节码可在任何支持 JVM 的平台上运行

JDK = JRE + 开发工具

jvm.webp

JDK 版本

  • Java SE(Standard Edition)

    • JDK 是 Java SE 的官方实现和开发工具包

    • 当你从 Oracle 或 OpenJDK 下载 “JDK”,你下载的就是 Java SE 的 JDK,用于开发桌面、服务器和通用应用程序

    • 因此,标准的 JDK = Java SE 的开发套件

  • Java EE(Enterprise Edition)

    • Java EE(现称为 Jakarta EE)是建立在 Java SE 之上的企业级扩展规范,提供 Web 容器、EJB、JPA、JMS 等企业功能

    • JDK 本身不包含 Java EE 的 API 实现,但 Java EE 应用依赖 JDK(即 Java SE)作为基础运行环境

    • 要开发 Java EE 应用,你需要:

      • JDK(用于编译和运行)

      • 额外的应用服务器(如 WildFly、TomEE、GlassFish)或 Jakarta EE 兼容库

  • Java ME(Micro Edition)

    • 面向嵌入式设备和资源受限环境(如旧式手机、传感器)

    • Java ME 有自己独立的 SDK,与标准 JDK 不同

    • 标准 JDK 不包含 Java ME 的工具或类库

JDK 的组成

JDK 是一套完整的 Java 开发工具包,内部包含一个专用的 Java 虚拟机(JVM)以及开发 Java 应用程序所需的各类工具和资源

核心组件

  • Java 运行时环境(JRE):JDK 内嵌了一个称为 “私有运行时”(Private Runtime)的 JRE。它不仅包含生产环境中使用的标准类库和 JVM,还额外集成了开发者专用的库,例如:

    • 国际化支持库(java.text, java.util.Locale 等)

    • IDL(Interface Definition Language)库(用于 CORBA 支持)

    • 调试与监控工具依赖的内部 API

  • Java 解释器 / 加载器java 命令):用于启动 JVM 并运行已编译的 .class 文件或 .jar 应用

  • Java 编译器javac):将 .java 源代码编译为平台无关的字节码(.class 文件)

  • 归档工具jar):用于打包 Java 类文件、资源和元数据到可分发的 JAR 文件中

  • 其他实用工具

    • javadoc:从源码生成 API 文档

    • jdb:命令行调试器

    • jconsole / jvisualvm:性能监控与分析工具

    • keytool:密钥与证书管理

    • jdeps:分析类依赖关系

注意:JDK 中的私有 JRE 通常不对外暴露给系统级应用使用,而是专供开发工具链内部调用,确保开发与运行环境的一致性。

主流 JDK 发行版

尽管 JDK 规范由 Oracle 主导,但如今存在多个高质量、开源或商业支持的实现:

JDK 发行版

特点

OracleJDK

长期被视为官方参考实现,提供商业支持;自 Java 11 起采用订阅模式(免费用于开发,生产需授权)

OpenJDK

完全开源的参考实现,是 Oracle JDK 的上游基础。社区活跃,支持最新版本(如 JDK 17、21、23 等)

Azul Zulu

Azul Systems 提供的 OpenJDK 构建版,支持 Windows、Linux、macOS,提供免费及企业级支持选项

Azul Zing

面向低延迟、高吞吐场景(如金融交易系统),具备先进的 C4 垃圾回收器,主要运行于 Linux

IBM Semeru Runtime

基于 Eclipse OpenJ9 虚拟机,内存占用低、启动快,支持 AIX、Linux、Windows 等平台

Amazon Corretto

AWS 提供的免费、生产就绪的 OpenJDK 发行版,包含长期安全更新,适用于云环境

安装 JDK

在开发环境中安装和配置 JDK 非常简单,只需按照以下步骤操作即可

下载并安装

  1. 访问 Oracle 官方 JDK 下载页面

  2. 选择适合你操作系统的 最新 LTS 版本(如 Java 17 或 Java 21),点击下载并运行安装程序

  3. 安装完成后,默认路径通常为:

    • Windows: C:\Program Files\Java\jdk-<version>

    • macOS: /Library/Java/JavaVirtualMachines/jdk-<version>.jdk

    • Linux: /usr/lib/jvm/java-<version>-openjdk

配置 JAVA_HOME 环境变量

JAVA_HOME 是许多开发工具(如 Maven、Gradle、Tomcat)识别 JDK 位置的关键环境变量

设置步骤:

  • 右键点击“此电脑”或“我的电脑” → 选择 属性

  • 点击 高级系统设置 → 在“系统属性”窗口中点击 环境变量

在“系统变量”区域,点击 新建

  • 变量名JAVA_HOME

  • 变量值:JDK 的安装路径(例如:C:\Program Files\Java\jdk-17

%JAVA_HOME%\bin 添加到 系统 PATH 变量中,以便在命令行任意位置使用 javajavac 命令

验证安装

打开 命令提示符(CMD)或终端,执行以下命令:

java -version

应显示已安装的 Java 运行时版本。

javac -version

应显示 JDK 编译器版本(若未显示,说明 PATH 未正确配置)

注意:部分系统在安装后需 重启终端重启计算机 才能使环境变量生效

编译与运行

编写源代码

首先,创建一个名为 Hello.java 的文本文件,内容如下:

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello Geek!");
    }
}

注意:Java 类名必须与文件名完全一致(区分大小写)

编译源文件

使用 JDK 自带的编译器 javac.java 文件编译为字节码(.class 文件)

命令示例(Windows):

"C:\Program Files\Java\jdk-17.0.1\bin\javac.exe" Hello.java

如果已将 javac 所在目录(即 %JAVA_HOME%\bin)添加到系统 PATH,可直接使用:

javac Hello.java

成功编译后,会在同一目录下生成 Hello.class 文件

若提示 “系统找不到指定路径”,请检查:

  • 文件路径是否正确

  • 是否在当前目录下执行命令

  • javac 是否在 PATH 中或使用了完整路径

运行程序

使用 java 命令执行已编译的类(不要加 .class 后缀):

java Hello

输出:

Hello Geek!

此时 JVM 会加载 Hello.class 并执行 main 方法

JDK 常用工具组件

工具名称

用途说

javac

Java 编译器,将 .java 源代码编译为平台无关的字节码(.class 文件)。

java

Java 应用启动器,加载并运行已编译的 .class 文件或 JAR 包。

javap

类文件反汇编器,用于查看 .class 文件的字节码、方法签名和内部结构。

javadoc

从源码中的文档注释(/** ... */)自动生成 HTML 格式的 API 文档。

jar

Java 归档工具,用于创建、查看、提取或更新 JAR(Java Archive)文件。

appletviewer

(已弃用)用于在无浏览器环境下测试和调试 Java Applet(现代开发中极少使用)。

xjc

XML Schema to Java 编译器(属于 JAXB),根据 XSD 生成对应的 Java 类。

apt

(已弃用)注解处理工具,用于在编译期处理注解;现已被 javac 内置的注解处理器取代。

jdb

Java 调试器,支持命令行方式调试 Java 程序(断点、单步执行等)。

jmc

高级性能监控与分析工具,配合 Flight Recorder 使用,适用于生产级性能调优。

jconsole

图形化监控工具,可实时查看 JVM 内存、线程、类加载及 MBean 信息。

pack200

高效压缩 JAR 文件的工具(常用于网络分发),对应解压工具为 unpack200。(Java 14 起已移除

extcheck

检测扩展目录中 JAR 文件版本冲突的工具。(已废弃

idlj

IDL(接口定义语言)到 Java 的编译器,用于 CORBA 分布式系统开发。

keytool

密钥和证书管理工具,用于创建和管理 keystore,常用于 HTTPS、代码签名等安全场景。

jstat

JVM 统计监控工具,实时输出 GC、类加载、内存池等性能数据。

jstatd

jstat 的远程守护进程,允许远程监控 JVM(需配合 RMI 使用)。

jshell

Java 9 引入的交互式 REPL(读取 - 求值 - 打印循环)工具,支持即时执行 Java 表达式和代码片段。

jstack

打印指定 Java 进程的线程堆栈跟踪,用于诊断死锁、高 CPU 或线程阻塞问题。

jrunscript

命令行脚本引擎,支持运行 JavaScript、Groovy 等脚本语言(基于 JSR-223)。

jhat

Java 堆转储分析工具,可启动 Web 服务分析 hprof 文件。(已废弃,推荐使用 VisualVM 或 Eclipse MAT

jinfo

查看或动态修改目标 JVM 的配置参数(如 -XX 选项)。(部分功能受限于 JVM 实现)

jmap

(未列出但常用)生成堆转储快照(heap dump)或查看内存映射。

jpackage

Java 14+ 引入,用于将 Java 应用打包为平台原生安装包(如 .exe, .dmg, .deb)。

javaws

Java Web Start 启动器,用于运行 JNLP 描述的网络应用。(Java 11 起已移除

javah

(已废弃)生成 JNI(Java Native Interface)所需的 C/C++ 头文件;Java 10 起由 javac -h 取代。

jarsigner

对 JAR 文件进行数字签名或验证其签名,确保代码来源可信与完整性。

javafxpackager

(旧版 JavaFX 工具)用于打包和签名 JavaFX 应用;现已被 jpackage 取代。