安装 JDK 并运行第一个程序
安装受支持的 JDK、验证 java/javac、编译并运行第一个程序,建立可重复的本地开发基线。
#type / howto
#status / growing
#tech / dev
#resource / java
[!info] 关联笔记
- 所属 MOC:工具链与构建 · 学习路线 · 语言基础
- 后续概念:程序结构与 main、Maven 基础、包与可见性
- 哲学入口:起源与平台哲学
- Windows 方案:使用 Scoop 安装并配置 Java 环境
安装 JDK 并运行第一个程序
目标
完成后应满足:
java -version与javac -version输出同一主版本的受支持 JDK- 能解释 JRE 能力与 JDK 的差别(开发需要编译器)
- 能
javac编译并java运行一个带main的类 - 能区分“环境坏了”与“代码错了”
这个场景为什么出现
学语法之前,必须先有一条可验证的工具链路径:
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;
// - java 后面跟的是“类名”,不是 .java 文件名。
public class HelloService {
public static void main(String[] args) {
// 就绪日志:验收时只关心这一行是否出现。
System.out.println("hello, Java");
}
}
建议运行:
javac HelloService.java
java HelloService
期望输出:
hello, Java
结合场景再看三个关注点
- JDK 必须含
javac:只有运行时、没有编译器时,你无法从源码闭环验证。 java HelloService不是java HelloService.java(现代启动器对源码-file 模式有扩展,但本系列入门先钉死经典 class 路径)。- 版本要写进团队约定:CI 与本地主版本不一致是“偶发失败”的常见根因。
核心步骤与准确模型
1. 安装受支持的 JDK
优先选择:
- Eclipse Temurin 等 OpenJDK 构建
- 发行版厂商提供的 JDK 安装包
- 包管理器(Windows 可用 Scoop,见 Scoop 方案)
建议学习基线:LTS(如 17 或 21,以团队与当前时间为准)。
[!warning] 版本边界 语言笔记不把补丁号写成永久真理。安全修订优先升级;特性以 JEP/发行说明为准。
2. 验证工具链
java -version
javac -version
echo "$JAVA_HOME"
| 检查项 | 期望 |
|---|---|
java | 可执行,主版本符合约定 |
javac | 可执行,主版本与 java 一致 |
JAVA_HOME | 指向该 JDK 根目录(许多工具依赖) |
若 java 有而 javac 无:你可能只装了 JRE 或 PATH 指错。
3. 编译与运行模型
HelloService.java --javac--> HelloService.class --java--> 进程输出
- 编译单元:
.java源文件 - 二进制形态(默认):
.class字节码 - 启动:JVM 加载类并调用
main
4. 常见失败对照
| 现象 | 优先检查 |
|---|---|
command not found: javac | 未装 JDK 或 PATH/JAVA_HOME |
UnsupportedClassVersionError | 运行用的 Java 比编译用的旧 |
Could not find or load main class | 类名/包名/当前目录/工作目录不对 |
| 中文乱码 | 终端编码与 file.encoding;另见字符串篇 |
5. 下一步:不要停在单文件
真实项目用 Maven/Gradle 管理多模块与测试。单文件闭环通过后进入:
工程实践
- 在 shell 配置中固定
JAVA_HOME,避免 GUI 安装器与终端各用各的。 - CI 镜像与本地使用同一发行版家族与主版本。
- 验收脚本同时检查
java与javac。 - 不要从不明来源下载“绿色 JDK 包”。
可验证实验
- 修改输出字符串,重新
javac后再java,确认必须重编译才变化。 - 用
javap -c HelloService(若可用)看方法字节码轮廓,建立“.class 可反查”的直觉。 - 在错误目录执行
java HelloService,阅读类找不到错误。
本节总结
- 开发需要 JDK(编译器 + 运行时工具),不是只有运行时
- 最小闭环:
javac→java - 版本一致是跨机器可重复的第一道门
自测题
概念题
- 为什么本系列要求同时验证
javac与java?
操作排错题
- 出现
UnsupportedClassVersionError应如何处理? java HelloService.java与经典javac+java教学路径如何取舍?
参考答案
- 只有运行时无法从源码完成编译验证;本地开发日常两者都要。
- 升级运行用 JRE/JDK 到 ≥ 编译版本,或用较低
--release/目标版本重新编译。 - 源码启动模式适合快速试验;团队基线与排障仍应理解
.class与 classpath 模型。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| Adoptium / Temurin | 发行 | 常用 OpenJDK 构建 |
| Java SE Documentation | 官方文档 | 工具与 API |
| javac Tool Reference | 工具文档 | 编译器行为入口 |