使用标准 JDK 编译和运行 Java 程序

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 环境变量中。这样,您可以在命令行中从任何目录使用 javacjava 命令。对于 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.javajavac 会一并编译 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 按以下顺序加载类:

  1. 引导类:Java 平台核心类,位于 rt.jar
  2. 扩展类:位于 JRE 的扩展目录(如 jre/lib/ext)。
  3. 用户类:通过 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
javawWindows 无控制台运行javaw HelloWorld
java -cp指定类路径运行程序java -cp .;lib.jar HelloWorld
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

面朝大海,春不暖,花不开

您的鼓励是我最大的创造动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值