Skip to content

环境搭建 ​

Java 初级 · 入门与环境

很多人装环境时只是「照着教程点下一步」,但不知道 JDK、JRE、JVM 到底谁包含谁,也不明白「为什么 Java 能跨平台」。本节不只教你怎么装,更要讲清这套工具链背后的原理——理解了原理,将来遇到版本冲突、编译运行不一致等问题,你才知道从哪下手排查。

一、先搞懂:JDK、JRE、JVM 的关系 ​

这三个缩写常被混用,但职责完全不同。从包含关系看,是 JDK ⊃ JRE ⊃ JVM:

  • JVM(Java Virtual Machine):一台「虚拟的计算机」。它定义了一套字节码指令集和运行时内存模型,能把 .class 字节码翻译成当前操作系统能执行的机器码。不同平台有各自的 JVM 实现,这正是跨平台的真正载体。
  • JRE(Java Runtime Environment):JVM + 运行 Java 程序所需的核心类库(在 Java 9 之后以模块 java.base 等形式提供)。只装 JRE 只能运行程序,不能编译源码。
  • JDK(Java Development Kit):JRE + 编译器 javac + 一堆开发工具(jar 打包、javadoc 生成文档、jdb 调试、jstack 看线程等)。写代码必须装 JDK。

一句话记忆

「写代码要 JDK,跑程序要 JRE,真正干活的是 JVM。」只运行别人打包好的程序才装 JRE;学习和开发一律装 JDK。

为什么 Java 能「一次编写,到处运行」 ​

关键在字节码这一中间层:

你在 Windows 上用 javac 把 .java 编译成 .class 字节码;这份字节码拿到 Linux、macOS 上,只要有对应平台的 JVM,就能直接运行——源码到字节码是一次性的,字节码到机器码由各平台 JVM 完成。Java 没有把程序直接编译成某一种 CPU 的机器码,而是编译成一套所有 JVM 都懂的中间指令,从而解耦了「编程语言」与「硬件平台」。

一个常见误解

「跨平台」的是字节码 + JVM,不是源码。如果你把 .java 直接发给别人,对方仍需要先 javac 编译。通常我们发布的是 .jar/.war(里面是 .class),而不是 .java。

二、版本怎么选:理解 LTS 与发布节奏 ​

Java 从 9 开始改为每 6 个月一个大版本(3 月、9 月),版本号飞速递增(17、21、22……)。其中:

  • LTS(Long-Term Support,长期支持版):Oracle 与社区提供多年的安全更新与补丁,适合学习与生产。当前主流 LTS 是 Java 17 和 Java 21。
  • 非 LTS(如 22、23):只有 6 个月支持,生命周期短,不适合长期使用。

学习建议

直接装 Java 21 LTS。它是目前最新的长期支持版,包含虚拟线程(Virtual Threads)、记录类(Record)、switch 表达式等现代特性,且能跑本教程所有示例。生产环境则以团队约定为准,但通常不会低于 17。

三、安装 JDK 21 并验证 ​

可从以下任一渠道下载(均为真实官方/社区源):

  • OpenJDK 官方构建
  • Eclipse Adoptium(原 AdoptOpenJDK,社区免费构建)
  • Oracle 官网(需留意许可协议,个人学习用一般免费)

Windows 下建议把 JDK 装到一个无空格的路径(如 C:\Java\jdk-21),然后配置 JAVA_HOME 并把 bin 目录加入 PATH:

bash
# 1) 设置 JAVA_HOME 指向 JDK 根目录(不是 bin,也不是 JRE)
set JAVA_HOME=C:\Java\jdk-21

# 2) 把 bin 目录加入 PATH(方便在任意目录直接用 javac / java)
set PATH=%JAVA_HOME%\bin;%PATH%

# 3) 验证:两个版本号必须一致
java -version
javac -version
text
# 期望输出示例(版本号以实际安装为准)
openjdk version "21.0.2" 2024-01-16
javac 21.0.2

版本不一致是头号坑

如果 java -version 与 javac -version 显示的版本不同(比如一个 17 一个 21),说明 PATH 里混入了多个 JDK,或者 JAVA_HOME 指向了别处。编译用 21、运行用 17,就会出现 UnsupportedClassVersionError。保证二者指向同一个 JDK 根目录。

四、IntelliJ IDEA:不只是「高级记事本」 ​

IDEA(社区版 Community 免费,旗舰版 Ultimate 收费)是 Java 开发的事实标准。它的价值远不止代码着色:

  • SDK 管理:在 Project Structure → SDK 指定用哪个 JDK,项目编译运行都用它,避免命令行 PATH 的混乱。
  • 智能补全与红线提示:写错签名、少导包,编辑器立刻标红。
  • 断点调试(Debug):能逐行执行、看变量值、看调用栈——这是理解「程序到底怎么跑」的最强工具。
  • 集成运行配置:每个 main 方法都能一键运行,本质还是帮你拼好了 java 类名。

TIP

初学阶段就要养成用 IDEA Debug 的习惯:在行号左侧点一下加红点,右键 Debug,然后用 Step Over(F8)逐行走,观察变量如何变化。这比读十遍文字更能建立「执行顺序」的直觉。

五、Maven:让依赖和构建不再手工拼 ​

当项目需要用到 MySQL 驱动、JUnit 等第三方库时,手工下载 jar 再 -classpath 拼路径既繁琐又易错。Maven 用一份 pom.xml 声明「我要什么」,自动从中央仓库下载并管理依赖:

xml
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.demo</groupId>
  <artifactId>student-manager</artifactId>
  <version>1.0</version>

  <dependencies>
    <!-- 坐标 = groupId:artifactId:version,Maven 自动下载并解决传递依赖 -->
    <dependency>
      <groupId>com.mysql</groupId>
      <artifactId>mysql-connector-j</artifactId>
      <version>8.3.0</version>
    </dependency>
  </dependencies>
</project>

Maven 的核心机制:

  • 坐标(Coordinate):groupId:artifactId:version 唯一锁定一个构件。
  • 本地仓库:默认 ~/.m2/repository,下载过的依赖缓存于此,下次离线可用。
  • 传递依赖:A 依赖 B,B 依赖 C,Maven 自动把 C 也带上,并做冲突仲裁(最短路径优先)。
  • 生命周期:compile → test → package → install,一条命令完成编译、测试、打包。

WARNING

IDEA 内置了 Maven,一般不需要单独装。但务必确认 IDEA 用的是「捆绑 Maven」还是你自己的,避免两套配置导致依赖找不到。另外 pom.xml 改了依赖后要点 Reload(或 Maven 面板的刷新图标)才会真正下载。

六、从源码到运行的完整链路(原理前瞻) ​

把前面几点串起来,一个 Java 程序从你写下代码到屏幕出结果,中间经历:

  1. 编译:javac 把人写的 .java 翻译成与平台无关的字节码 .class。
  2. 类加载:运行时由类加载器把字节码读入内存。
  3. 校验:字节码校验器检查指令合法性(防止手写的非法字节码破坏 JVM)。
  4. 执行:解释器逐条解释执行;同时 JIT(Just-In-Time)编译器 会把频繁执行的热点代码编译成本地机器码,后续直接跑机器码,性能接近 C++。
  5. 落地:最终通过 JVM 调用操作系统接口,完成输出、网络、文件等操作。

JIT 让 Java 既「跨平台」又「快」

初学常听说「Java 慢」,那是早年纯解释执行的时代。现代 JVM 用 JIT 把热点代码编译成机器码并做内联、逃逸分析等优化,长期运行的程序性能已非常接近原生编译语言。这也是为什么字节码 + JIT 是比「直接编译成机器码」更聪明的折中。

七、常见误区与注意点 ​

WARNING

  • 只装了 JRE 却想 javac:报「不是内部或外部命令」。记住编译要 JDK。
  • JAVA_HOME 指向 JRE 或版本混杂:多 JDK 共存时,java 与 javac 可能来自不同版本,导致 UnsupportedClassVersionError。统一指向同一个 JDK 根目录。
  • 环境变量改了没重开终端:PATH 在打开终端时就固定了,修改后需重开命令行窗口才生效。
  • IDEA 里 SDK 没配对:项目实际用的 JDK 是 IDEA Project Structure 里指定的,跟系统 PATH 可以不一样,两边都要确认。

八、最佳实践 ​

  1. 学习用 LTS(Java 21),生产对齐团队版本,不追非 LTS。
  2. 一次性把 JAVA_HOME + PATH 配对,并用 java -version、javac -version 双验证一致。
  3. 用 IDEA + Maven 管理项目,告别手工 javac + 手工拼 -classpath。
  4. 早期就养成「一个项目一个 pom.xml」的习惯,依赖集中声明、自动下载。
  5. 学会用 Debug 而非只靠 println——前者能看执行流,后者只能看结果。

📚 官方文档与参考资料 ​

✏️ 练习与自测 ​

  1. 安装 JDK 21,在终端执行 java -version 与 javac -version,确认二者版本号一致并截图记录。
  2. 在 IDEA 中新建 Java 项目,确认 Project SDK 指向 Java 21,跑通一个输出 Hello, Java! 的程序。
  3. 在 pom.xml 中添加一个 JUnit 依赖,点击 Reload,观察 IDEA 是否自动把 jar 下载到本地仓库(~/.m2)。
  4. 思考并回答:把你电脑上编译好的 .class 文件发给用 macOS 的同学,他能直接运行吗?为什么?(提示:结合 JVM 与字节码的关系)

本节小结

环境搭建的核心不是「点下一步」,而是理解 JDK ⊃ JRE ⊃ JVM 的层级、Java 靠「字节码 + 各平台 JVM」实现跨平台、以及版本一致性的重要性。装好 JDK 21 + IDEA + Maven 这套标准三件套,你就拥有了一个能编译、运行、管理依赖的完整 Java 开发环境,也为理解后续「程序到底怎么跑起来」打下了基础。