Java 是一种功能强大且跨平台的编程语言,广泛应用于从移动应用到企业级软件的开发。其“一次编写,到处运行”(Write Once, Run Anywhere)的特性依赖于 Java 虚拟机(JVM),而 Java 开发工具包(JDK,Java Development Kit)是开发和运行 Java 程序的核心工具。JDK 包含编译器(javac
)、运行时环境(JRE)以及其他开发工具。本文将详细介绍如何使用标准 JDK 编译和运行 Java 程序,探讨 Java 11 和 Java 22 的新特性,并解释 CLASSPATH 的作用和替代运行时选项。
在开始之前,请确保已正确安装 JDK,并将 JDK 的 bin
目录添加到系统 PATH 环境变量中。这样,您可以在命令行中从任何目录使用 javac
和 java
命令。对于 macOS 和 Linux 用户,可能需要更新 shell 配置文件(如 .bashrc
或 .profile
)以设置 PATH。
编译 Java 程序
使用 javac
命令
要编译 Java 程序,使用 JDK 提供的 javac
命令。javac
将 Java 源文件(.java)编译为字节码文件(.class),这些字节码文件可由 JVM 执行。基本命令格式如下:
javac 文件名.java
例如,假设有一个简单的 Java 程序:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World");
}
}
保存为 HelloWorld.java
,然后运行:
javac HelloWorld.java
此命令会在同一目录下生成 HelloWorld.class
文件。如果程序引用了其他类,且这些类的源文件在同一目录中尚未编译,javac
会自动编译它们。例如,若 HelloWorld.java
依赖 Helper.java
,javac
会一并编译 Helper.java
。
注意事项
- 确保文件名与类名一致,且文件名区分大小写。
- 如果出现“
javac
不是内部或外部命令”错误,检查是否正确设置了 PATH 环境变量。 - 编译器遵循“无消息即成功”的原则,若无错误输出,表示编译成功。
运行 Java 程序
使用 java
命令
编译完成后,使用 java
命令运行程序,指定主类名(不含 .class 扩展名):
java 类名
对于上述示例,运行:
java HelloWorld
这将执行 HelloWorld.class
中的 main
方法,输出:
Hello, World
Windows 下的 javaw
在 Windows 系统中,可使用 javaw
命令运行程序,与 java
功能相同,但不会显示控制台窗口,适合图形界面程序。例如:
javaw HelloWorld
注意事项
- 运行时需确保主类包含
public static void main(String[] args)
方法。 - 如果出现“找不到或无法加载主类”错误,可能是类路径配置错误,详见下文 CLASSPATH 部分。
Java 11 及以后的新特性
Java 11:直接运行单文件源代码
自 Java 11 起,Java 引入了“单文件源代码程序启动”(JEP 330)功能,允许直接运行 .java 文件,无需先编译。这对于初学者或测试小型程序非常方便。命令格式为:
java 文件名.java
例如:
java HelloWorld.java
JVM 会在内存中编译源代码并执行,输出 “Hello, World”。此功能仅适用于单文件程序,所有依赖类必须定义在同一文件中。如果程序引用其他文件中的类,需先编译这些类或将所有类合并到同一文件。
此特性简化了开发流程,尤其适合快速原型设计或学习 Java 的新手。结合 Java 的交互式解释器 jshell
,它为初学者提供了强大的工具集。
Java 22:多文件支持(待确认)
根据一些资料,Java 22 可能扩展了直接运行源代码的功能,支持多个源文件。例如,在包含多个 .java 文件的目录中运行:
java Main.java
可能自动编译和运行相关文件。然而,此功能的具体实现和限制需参考官方文档(如 Oracle JDK 22 发布说明)确认。
CLASSPATH 的使用
什么是 CLASSPATH
CLASSPATH 是一个环境变量,指定 Java 编译器和 JVM 查找用户定义类和包的路径。它可以包含目录、JAR 文件或 ZIP 文件。JVM 按以下顺序加载类:
- 引导类:Java 平台核心类,位于
rt.jar
。 - 扩展类:位于 JRE 的扩展目录(如
jre/lib/ext
)。 - 用户类:通过 CLASSPATH 或默认类路径加载。
默认类路径
在现代 Java 版本(Java 9 及以上),默认类路径包含当前目录(.)。这意味着,对于简单程序,您无需设置 CLASSPATH 即可运行。例如,若 HelloWorld.class
位于当前目录,java HelloWorld
会正常工作。
自定义 CLASSPATH
如果程序引用了其他目录或 JAR 文件中的类,需设置 CLASSPATH。可以通过以下方式指定:
- 命令行选项:使用
-cp
或-classpath
:
java -cp .;lib/framework.jar HelloWorld
Windows 使用分号(;),Linux/macOS 使用冒号(:)分隔路径。
- 环境变量:设置系统环境变量 CLASSPATH:
export CLASSPATH=.:/path/to/lib/framework.jar # Linux/macOS
set CLASSPATH=.;C:\path\to\lib\framework.jar # Windows
注意:设置 CLASSPATH 会覆盖默认值,若需保留当前目录,需显式包含 “.”。
历史背景
在早期 Java 版本中,运行当前目录的程序需显式设置 CLASSPATH 包含 “.”。现代 Java 消除了这一要求,简化了开发流程。
其他 Java 运行时
OpenJDK
OpenJDK 是 Java SE 平台的开源实现,自 Oracle 发布以来已成为标准参考实现。多个组织(如 AdoptOpenJDK、Azul Systems)提供 OpenJDK 构建,免费下载和使用。OpenJDK 与 Oracle JDK 功能相当,广泛应用于生产环境。
IBM OpenJ9
IBM 的 J9(现为 Eclipse OpenJ9)是一个高性能、可扩展的 JVM 实现,符合 Java 虚拟机规范。它集成于 IBM 的中间件产品(如 WebSphere Application Server)中,并通过 IBM Semeru Runtimes 提供预构建二进制文件。OpenJ9 适合从企业应用到云服务的多种场景。
历史运行时
过去存在其他 Java 运行时,如 Apache Harmony 和 Jikes,但随着 OpenJDK 的开源,大多数已停止维护。
总结
使用标准 JDK 编译和运行 Java 程序是一个简单而高效的过程。通过 javac
编译源文件,java
运行字节码,开发者可以快速构建和测试程序。Java 11 引入的单文件源代码运行功能简化了开发流程,Java 22 可能进一步扩展了这一功能。CLASSPATH 的默认设置使得简单程序无需额外配置,而 OpenJDK 和 OpenJ9 提供了可靠的运行时选择。
在开始之前,请确保 JDK 已正确安装并配置 PATH 环境变量。无论是初学者还是专业开发者,掌握这些基础知识将为您的 Java 开发之旅奠定坚实基础。
示例代码
以下是一个完整的示例,展示编译和运行过程:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World");
}
}
编译:
javac HelloWorld.java
运行:
java HelloWorld
直接运行(Java 11+):
java HelloWorld.java
环境配置
为确保命令可用,需将 JDK 的 bin
目录添加到 PATH:
- Windows:右键“此电脑” > 属性 > 高级系统设置 > 环境变量 > 编辑 PATH,添加 JDK 的
bin
路径(如C:\Program Files\Java\jdk-21\bin
)。 - Linux/macOS:编辑
~/.bashrc
或~/.zshrc
,添加:
export PATH=$PATH:/path/to/jdk/bin
表格:常用 JDK 命令
命令 | 功能 | 示例 |
---|---|---|
javac | 编译 Java 源文件 | javac HelloWorld.java |
java | 运行编译后的字节码 | java HelloWorld |
javaw | Windows 无控制台运行 | javaw HelloWorld |
java -cp | 指定类路径运行程序 | java -cp .;lib.jar HelloWorld |