命令行编译运行
IDE 方便但隐藏了细节。掌握命令行编译运行,才能理解 Java 的编译运行机制,也是排查环境问题的基础。
基本用法
bash
javac HelloWorld.java
java HelloWorld关键区别:javac 是 Java 编译器,将 .java 源文件编译为 .class 字节码;java 是 Java 虚拟机,执行 .class 字节码。运行的是类名,不是文件名。
javac 常用参数
| 参数 | 说明 | 示例 |
|---|---|---|
-d <dir> | 指定输出目录 | javac -d out Hello.java |
-cp <path> | 指定类路径 | javac -cp lib:. Hello.java |
-source <version> | 指定源码版本 | javac -source 17 Hello.java |
-target <version> | 指定目标字节码版本 | javac -target 11 Hello.java |
-encoding <encoding> | 指定字符编码 | javac -encoding UTF-8 Hello.java |
示例:指定输出目录
bash
# 创建 out 目录并编译到指定目录
mkdir out
javac -d out HelloWorld.java
# 查看生成的文件
ls out/
# HelloWorld.classjava 常用参数
| 参数 | 说明 | 示例 |
|---|---|---|
-cp <path> | 指定类路径 | java -cp out HelloWorld |
-D<name>=<value> | 设置系统属性 | java -Dname=Alice HelloWorld |
-Xms<size> | 设置初始堆大小 | java -Xms256m HelloWorld |
-Xmx<size> | 设置最大堆大小 | java -Xmx512m HelloWorld |
-D<name>=<value> | 设置系统属性 | java -Dname=Alice HelloWorld |
示例:设置系统属性
java
public class ConfigDemo {
public static void main(String[] args) {
String name = System.getProperty("name", "World");
System.out.println("Hello, " + name);
}
}bash
javac ConfigDemo.java
java -Dname=Alice ConfigDemo
# 输出: Hello, Alice类路径(ClassPath)
类路径告诉 JVM 在哪里找 .class 文件。
目录结构
project/
├── out/ # 编译输出目录
│ └── com/example/
│ └── App.class
├── lib/ # 依赖目录
│ └── util.jar
└── src/ # 源码目录
└── com/example/
└── App.java设置类路径
bash
# Windows (使用分号分隔)
java -cp "out;lib/*;." com.example.App
# macOS/Linux (使用冒号分隔)
java -cp "out:lib/*:." com.example.App| 符号 | 说明 |
|---|---|
. | 当前目录 |
* | 当前目录下的所有 jar 文件 |
;(Windows)或 :(Linux/macOS) | 路径分隔符 |
带包名的程序
源码结构
src/
└── com/
└── example/
└── App.java源码内容
java
package com.example;
public class App {
public static void main(String[] args) {
System.out.println("Hello from package!");
}
}编译与运行
bash
# 编译到 out 目录(保持包结构)
javac -d out src/com/example/App.java
# 运行(使用完全限定类名)
java -cp out com.example.App为什么包名要对应目录
JVM 通过类路径 + 包名定位 .class 文件。com.example.App 必须在 类路径/com/example/App.class。
常见错误
javac: command not found — JDK 未安装或 PATH 未配置。执行 echo $JAVA_HOME 确认。
Error: Could not find or load main class — 检查类名是否正确,使用 -cp 指定正确的类路径,确认包结构与目录结构匹配。
No such file or directory — 当前目录下没有该文件。执行 ls 确认文件存在。
调试技巧
查看字节码:javap -c Hello
打印类加载信息:java -verbose:class MyClass
打印 GC 信息:java -verbose:gc MyClass
后续可阅读:常见运行错误、IDEA 调试技巧、Java 程序运行机制
