← [ BACK_TO_NOTES ]

安装 JDK 并运行第一个程序

安装受支持的 JDK、验证 java/javac、编译并运行第一个程序,建立可重复的本地开发基线。

#howto #growing #dev #java

[!info] related notes

安装 JDK 并运行第一个程序

目标

完成后应满足:

  1. java -version 与 javac -version 输出同一主版本的受支持 JDK
  2. 能解释 JRE 能力与 JDK 的差别(开发需要编译器)
  3. 能 javac 编译并 java 运行一个带 main 的类
  4. 能区分“环境坏了”与“代码错了”

这个场景为什么出现

学语法之前,必须先有一条可验证的工具链路径:

  • java / javac 在 PATH 中
  • 版本可知且主版本一致
  • 能完成“源码 → 字节码 → 执行”闭环

否则后续所有报错都分不清是代码问题还是环境问题。本篇是 howto:目标不是讲完语言,而是装好、跑通、知道坏了怎么查。

[!abstract] 一句话理解 安装 JDK(含编译器)→ 用 java/javac -version 验收 → 写入口类 → javac 生成 .class → java 启动 →(可选)再用构建工具包装。

最小可运行示例

先把示例放进业务场景,再看代码:

场景:新同事第一天验证本机能否提交 Java 服务改动

在拉仓库、跑 Maven 之前,先用零依赖程序证明:本机能编译、能运行、输出符合预期。
教学点:入口类、编译产物、启动器参数。

// HelloService.java
// 业务角色:模拟服务进程启动时打印就绪日志。
//
// 业务意图:
// 1. 提供 JVM 可识别的 main 入口;
// 2. 打印固定就绪文案,供环境验收脚本比对。
//
// 教学点:
// - 文件名与 public 类名一致(public class HelloService → HelloService.java);
// - javac 生成 HelloService.class;
// - 本例编译后使用类名启动;源码文件启动是另一种模式。

public class HelloService {
    public static void main(String[] args) {
        // 就绪日志:验收时只关心这一行是否出现。
        System.out.println("hello, Java");
    }
}

建议运行:

javac HelloService.java
java HelloService

期望输出:

hello, Java

结合场景再看三个关注点

  1. JDK 必须含 javac:只有运行时、没有编译器时,你无法从源码闭环验证。
  2. java HelloService 不是 java HelloService.java(现代启动器对源码-file 模式有扩展,但本系列入门先钉死经典 class 路径)。
  3. 版本要写进团队约定:CI 与本地主版本不一致是“偶发失败”的常见根因。

核心步骤与准确模型

1. 安装受支持的 JDK

优先选择:

按项目支持矩阵选择仍获所选发行商支持的版本;本系列示例主要以 JDK 21 验证。LTS 的支持期限和授权条款由发行商决定,不仅取决于主版本号。

[!warning] 版本边界 语言笔记不把补丁号写成永久真理。安全修订优先升级;特性以 JEP/发行说明为准。

2. 验证工具链

java -version
javac -version
printf '%s\n' "${JAVA_HOME:-未设置}"
command -v java
command -v javac
检查项期望
java可执行,主版本符合约定
javac可执行,主版本与 java 一致
JAVA_HOME指向该 JDK 根目录(许多工具依赖)

以上命令用于 POSIX shell;Windows 可用 PowerShell 的 Get-Command java,javac 与 $env:JAVA_HOME 检查。若 java 有而 javac 无,可能只装了运行时或 PATH 指错。JAVA_HOME 不会自动改写 PATH,直接运行 java/javac 仍以实际解析到的命令为准。

3. 编译与运行模型

HelloService.java  --javac-->  HelloService.class  --java-->  进程输出
  • 编译单元:.java 源文件
  • 二进制形态(默认):.class 字节码
  • 启动:JVM 加载类并调用 main

4. 常见失败对照

现象优先检查
command not found: javac未装 JDK 或 PATH/JAVA_HOME
UnsupportedClassVersionErrorclass 文件目标版本高于运行时支持范围,或预览特性版本/启动参数不匹配
Could not find or load main class类名/包名/当前目录/工作目录不对
中文乱码区分源文件解码、程序读写编码和终端编码;必要时 javac -encoding UTF-8,见字符串篇

5. 下一步:不要停在单文件

真实项目用 Maven/Gradle 管理多模块与测试。单文件闭环通过后进入:

工程实践

  1. 在 shell 配置中固定 JAVA_HOME,避免 GUI 安装器与终端各用各的。
  2. CI 镜像与本地使用同一发行版家族与主版本。
  3. 验收脚本同时检查 java 与 javac。
  4. 不要从不明来源下载“绿色 JDK 包”。

可验证实验

  1. 修改输出字符串,重新 javac 后再 java,确认必须重编译才变化。
  2. 用 javap -c HelloService(若可用)看方法字节码轮廓,建立“.class 可反查”的直觉。
  3. 在错误目录执行 java HelloService,阅读类找不到错误。

本节总结

  • 开发需要 JDK(编译器 + 运行时工具),不是只有运行时
  • 最小闭环:javac → java
  • 版本一致是跨机器可重复的第一道门

自测题

概念题

  1. 为什么本系列要求同时验证 javac 与 java?

操作排错题

  1. 出现 UnsupportedClassVersionError 应如何处理?
  2. java HelloService.java 与经典 javac+java 教学路径如何取舍?
参考答案
  1. 只有运行时无法从源码完成编译验证;本地开发日常两者都要。
  2. 对齐 class 目标版本与运行时;需要兼容旧版本时用 javac --release N 同时约束语法、class 版本和所选 Java SE API。仅改 -target 不保证 API 兼容,第三方依赖也需满足目标版本;预览产物另有同版本和 —enable-preview 要求。
  3. 源码启动模式适合快速试验;团队基线与排障仍应理解 .class 与 classpath 模型。

延伸阅读与资料来源

资料类型支撑内容
Adoptium / Temurin发行常用 OpenJDK 构建
Java SE Documentation官方文档工具与 API
javac Tool Reference工具文档编译器行为入口
创建于 2026/7/15 更新于 2026/10/6
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本