Skip to content

命令行编译运行

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.class

java 常用参数

参数说明示例
-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 程序运行机制

基于 VitePress 构建