- 文档
- 教程
- 知识库
【免费下载链接】til
:memo: Today I Learned
本文以 TIL 仓库中 java/run-a-hello-world-program-in-eclipse.md 为核心,完整讲解在 Eclipse IDE 中从零运行一个 Java Hello World 程序的完整链路:新建 Java 项目、在src源文件夹中创建带main方法的类、直接运行输出Hello, World!,以及通过Run Configurations的Program Arguments传入自定义名字让程序输出个性化问候。读完本文,你将掌握 Eclipse 中最基础的 Java 项目创建与运行机制,并理解main方法签名、String[] args参数与三元运算符的实际含义。
前置准备:JDK 与 Eclipse 环境
在 Eclipse 中运行任何 Java 程序,前提是机器上已经安装了可用的 JDK(Java Development Kit)。如果使用的是 macOS 且尚未安装,可以参考仓库中的 java/install-java-on-mac-with-brew.md 一文:通过 Homebrew 执行brew install java安装 OpenJDK,并用brew info openjdk给出的sudo ln -sfn命令完成符号链接,之后用下面的命令验证安装:
$ java -version能够正常输出版本信息(例如openjdk version "23" 2024-09-17)即代表 JDK 可用。Eclipse 自身的 Java 开发工具(JDT)会自动检测系统 JRE/JDK,也可以在某次启动时在Preferences → Java → Installed JREs中手动指定。
第一步:新建 Java 项目
在 Eclipse 中,所有 Java 代码都归属于一个Java Project。如果你还没有可用的项目,按照如下步骤创建:
- 菜单栏选择File → New → Java Project;
- 在Project name输入框中填写项目名(例如
HelloWorld); - 在JRE区域确认选择了上一步安装的 JDK(一般保留默认即可);
- 点击Finish。
默认配置下,Eclipse 会为该项目自动创建名为src的源文件夹(Source Folder)用于存放.java源码,并在bin(或项目设置的输出目录)中存放编译后的.class字节码。后续创建类时,请务必选中src文件夹,这样源码才能被 Eclipse 的构建器识别并自动编译。
第二步:在 src 中创建类并编写 main 方法
接下来在src文件夹中新建一个Class。右键点击src,选择New → Class(或菜单File → New → Class),在Name中输入Greeting。Package 一栏可以留空,此时类位于默认包(default package),正好适合这个极简示例。创建完成后,向其中填入如下代码(与 java/run-a-hello-world-program-in-eclipse.md 原文一致,Greeting.java的全部内容只有一个main方法):
public class Greeting { public static void main(String[] args) { String name = args.length > 0 ? args[0] : "World"; System.out.println("Hello, " + name + "!"); } }这段代码的每一部分都值得拆解:
public static void main(String[] args)是 Java 程序的入口方法。JVM 启动时会查找签名完全匹配的main方法并调用它,这就是 Eclipse 点击Run后实际触发的执行入口;String[] args是命令行参数数组——程序在运行时刻接收到的所有参数都会以字符串数组的形式传入;args.length > 0 ? args[0] : "World"是一个三元运算符(ternary operator)。它的语义是:如果args数组非空(即调用方传入了至少一个参数),就把第一个参数args[0]赋给name;否则回退到默认值"World";System.out.println(...)将结果打印到标准输出(stdout),也就是 Eclipse 的Console视图。
第三步:运行程序的两种方式
原文档给出了两种运行方式,分别对应"无参数"与"有参数"两种典型场景。
方式一:直接从 Run 菜单运行,输出 Hello, World!
从菜单栏选择Run → Run(默认快捷键为Ctrl+F11,macOS 上为Cmd+Shift+F11)。此时没有配置任何程序参数,args是一个长度为 0 的空数组,三元运算符走:分支,name取默认值"World",因此控制台输出:
Hello, World!方式二:通过 Run Configurations 配置 Program Arguments
如果希望程序"认识"某个具体的名字,就需要在运行配置中传入参数:
- 在Run菜单下选择Run Configurations...;
- 左侧选择Java Application下的
Greeting(如果没有则点击左上角新建一个); - 切换到Arguments标签页;
- 在Program arguments输入框中填入自定义名字,例如
Ruby; - 点击Run。
此时args[0]为Ruby,三元运算符走args.length > 0为真的分支,控制台输出:
Hello, Ruby!关于Program arguments还有两点值得注意:
- 多个参数用空格分隔,例如
Ruby Python,程序始终取args[0](即Ruby)作为名字,其余参数会被忽略; - 如果某个参数本身包含空格,需要用双引号包裹,例如
"Ada Lovelace",这样才能作为单个参数传入args[0]。
main 方法与参数传递的底层原理
从 Java 语言本身看,main方法签名中的public static表明它是一个静态入口,不依赖任何对象实例即可被 JVM 调用;args数组则完整对应命令行中的每个参数。Eclipse 做的只是把这些操作封装成了图形界面:Run菜单本质上等价于在终端中执行java Greeting(无参数),而Run Configurations中的Program Arguments等价于java Greeting Ruby。对标准 Java 编译器与运行时流程的上述描述,与本文示例在 JDK 命令行下验证的结果一致。
Eclipse 在背后完成的工作包括:使用内置编译器把Greeting.java编译为Greeting.class,再以项目输出目录为 classpath 启动 JVM 并调用Greeting.main。这也是为什么如果代码中只存在main方法、且项目配置正确,直接点击运行即可看到结果。
常见问题排查
- Selection does not contain a main type / Editor does not contain a main type:说明当前选中的类没有可执行的
main方法,或你选错了文件(例如选中了非 Java 文件)。确认运行目标为Greeting且其中存在public static void main(String[] args)。 - public class 与文件名不一致:Java 要求 public 类的类名必须与
.java文件名一致(此处都是Greeting),不一致会导致编译报错。 - Console 没有输出:确认运行的入口类是
Greeting,并且把Console视图切换到了当前进程(Console 视图右上角的按钮可切换显示各进程输出)。
延伸阅读:仓库内的相关 Java 笔记
本仓库的 Java 目录还收录了两篇与本主题互补的笔记,可继续深入:
- java/ensure-resources-always-get-closed.md:讲解try-with-resources构造,介绍如何确保打开的文件等资源在程序结束前总是被正确关闭,是编写健壮 Java 程序的进阶话题;
- java/install-java-on-mac-with-brew.md:在 macOS 上用 Homebrew 安装并配置 OpenJDK 的完整步骤,属于本文"前置准备"环节的配套指南。
- 文档
- 教程
- 知识库
【免费下载链接】til
:memo: Today I Learned
相关推荐
用 Devbox 搭建 Gradle + JDK 的 Java 开发环境:从零配置到可运行的 Hello World
用 Devbox 搭建 Gradle + JDK 的 Java 开发环境:从零配置到可运行的 Hello World 导读 本文以 Devbox 官方仓库中的
开发工具CLIFlink CDC 3.x 迁移指南:从 2.x 平滑升级的 5 步实操方案
Flink CDC 3.x 迁移指南:从 2.x 平滑升级的 5 步实操方案 当你把 MySQL 同步作业的依赖从 2.4.2 换成 3.x,最先看到的不是性能
后端数据集成大数据流处理变更数据捕获数据同步用 btop 盯死 CPU、内存与 GPU:从装完到定位瓶颈的 5 分钟路径
用 btop 盯死 CPU、内存与 GPU:从装完到定位瓶颈的 5 分钟路径 btop 是跑在终端里的 C++ 系统监控工具,把 CPU、内存、磁盘、网络、GP
CLI指标监控运维
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考