核心概念
.java文件: 这是程序员编写的源代码文件,使用 Java 语言编写,是人类可读的文本文件。.class文件: 这是 Java 编译器(javac)处理.java文件后生成的输出文件,它不是机器码,而是 Java 字节码(Java Bytecode),是一种平台无关的中间代码,Java 虚拟机(JVM)能够识别并执行这种字节码。javac: 这是 Java Compiler(Java 编译器)的命令行工具,它的作用就是读取.java文件,进行语法检查、类型检查等,并生成对应的.class文件。
环境准备
在开始之前,请确保你已经正确安装了 Java 开发工具包。

- 下载并安装 JDK: 从 Oracle 官网或 OpenJDK 等渠道下载并安装适合你操作系统的 JDK。
- 配置环境变量:
JAVA_HOME: 设置为你的 JDK 安装根目录(C:\Program Files\Java\jdk-17)。PATH: 在PATH变量中添加%JAVA_HOME%\bin(Windows) 或$JAVA_HOME/bin(Linux/macOS),这一步至关重要,因为它允许你在命令行的任何位置直接使用javac和java命令。
如何验证环境是否配置成功?
打开一个新的命令行窗口(cmd, PowerShell, Terminal 等),输入以下命令:
javac -version
如果看到类似 javac 17.0.2 的输出,说明 javac 命令可以找到,环境配置成功。
编译过程详解
我们通过一个最简单的 "Hello, World!" 例子来走一遍完整的编译流程。

创建源代码文件
- 创建一个名为
HelloWorld.java的文件。 - 在文件中写入以下代码:
// HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
注意:
- 文件名
HelloWorld.java必须与public class的名字HelloWorld完全一致(包括大小写)。 - 一个
.java文件中可以有一个public class,也可以有多个class(但只有一个可以是public的)。
打开命令行终端
导航到你保存 HelloWorld.java 文件的目录,如果你的文件保存在 D:\java_projects,你应该在终端中输入:
cd D:\java_projects
执行编译命令
在当前目录下,输入 javac 命令,后面跟上你的源文件名:
javac HelloWorld.java
命令解释:

javac: 调用 Java 编译器。HelloWorld.java: 要编译的源文件。
查看结果
如果编译成功,你会在命令行中看到没有任何提示(没有错误信息),回到你的文件目录,你会发现多了一个文件:
D:\java_projects\
├── HelloWorld.class <-- 新生成的字节码文件
└── HelloWorld.java <-- 原始源代码文件
这个 HelloWorld.class 文件就是我们要的目标,它包含了 JVM 可以理解的指令。
运行 .class 文件(验证)
编译只是生成了 JVM 能懂的“指令”,要执行它,还需要 java 命令。
在同一个命令行窗口中,输入:
java HelloWorld
命令解释:
java: 调用 Java 虚拟机(JVM)。HelloWorld: 要运行的类的名字。
⚠️ 重要注意: 运行 java 命令时,后面不需要加 .class 扩展名。java 命令是用来启动 JVM 并加载指定类的,而不是直接执行一个文件。
你会看到输出:
Hello, World!
高级编译选项
javac 命令非常强大,支持许多选项,这里介绍几个最常用的:
a) 指定输出目录
当项目变大时,我们通常希望将编译后的 .class 文件与源代码文件分开存放,可以使用 -d 选项。
- 创建一个名为
classes的目录。 - 执行编译命令,将输出指向
classes目录:
# -d . 表示输出到当前目录,-d classes 表示输出到 classes 目录 javac -d classes HelloWorld.java
执行后,你的目录结构会变成:
D:\java_projects\
├── classes\
│ └── HelloWorld.class <-- .class 文件被生成在这里
└── HelloWorld.java
b) 指定类路径
如果你的类依赖于其他库(JAR 包),你需要告诉编译器去哪里找这些依赖,使用 -cp (classpath) 或 -classpath 选项。
假设你有一个 mylib.jar 文件,并且你的 MyApp.java 用到了它:
# -cp 后面跟着依赖的路径(多个路径用 ; 或 : 分隔) javac -cp ".;mylib.jar" MyApp.java
- 表示当前目录,
mylib.jar是你的依赖库。
c) 显示详细输出
使用 -verbose 选项可以看到编译器在做什么,比如读取了哪些文件、生成了哪些文件等,有助于调试编译问题。
javac -verbose HelloWorld.java
d) 编译多个文件
你可以一次性编译多个文件,只需将它们都列在命令后:
javac File1.java File2.java File3.java
e) 设置源文件编码和目标 JDK 版本
为了确保代码在不同环境下的一致性,可以指定源文件编码和编译目标版本。
# -encoding UTF-8: 指定源文件编码为 UTF-8 # -source 11: 源代码兼容 Java 11 # -target 11: 生成的字节码版本为 Java 11 javac -encoding UTF-8 -source 11 -target 11 HelloWorld.java
常见错误及解决
| 错误信息 | 可能原因 | 解决方案 |
|---|---|---|
'javac' is not recognized as an internal or external command... |
JDK 的 bin 目录没有添加到系统的 PATH 环境变量中。 |
重新配置 JAVA_HOME 和 PATH 环境变量。 |
Error: Could not find or load main class HelloWorld |
运行命令时加了 .class 后缀(java HelloWorld.class)。不在正确的目录下运行(没有 cd 到包含 .class 文件的目录)。类有包名但没有在正确的目录结构中。 |
使用 java HelloWorld 命令。使用 dir 命令确认当前目录下有 HelloWorld.class 文件。如果有包名,需要调整目录结构或使用 -cp 指定路径。 |
HelloWorld.java:X: error: class HelloWorld is public, should be declared in a file named HelloWorld.java |
文件名与 public class 的名字不匹配。 |
将文件名修改为与 public class 名完全一致。 |
| 任务 | 命令 | 作用 |
|---|---|---|
| 编译 | javac YourFile.java |
将 .java 源文件编译成 .class 字节码文件。 |
| 运行 | java YourClassName |
启动 JVM,加载并执行指定的类。 |
掌握 javac 的基本使用是 Java 开发的基石,虽然现代开发(如使用 IntelliJ IDEA 或 Maven)会自动处理编译过程,但理解其背后的原理对于排查问题、构建脚本和深入学习 Java 都至关重要。
