diff --git a/README.md b/README.md index 67a5d51ce55f9285a8582836c49f4ef6b36799e6..b18ad14b202d36eb10b7d7dc99dc11c641766897 100644 --- a/README.md +++ b/README.md @@ -1,130 +1,60 @@ -# CLI 菜单应用 (CLI Menu App) +# CLI Menu Application -一个基于Java和Picocli构建的现代化命令行菜单应用程序,提供交互式菜单界面和命令行参数支持。 +这是一个基于Java的命令行菜单应用程序,具有以下特性: +- 支持交互式菜单模式 +- 支持命令行参数模式 +- 使用picocli库进行命令行解析 +- 包含时间显示和斐波那契数列计算功能 -## 项目概述 +## 构建 -这是一个使用Maven构建的Java命令行工具,具有以下特点: -- **双模式运行**: 支持交互式菜单模式和命令行参数模式 -- **美化界面**: 使用Picocli提供彩色输出和格式化显示 -- **功能丰富**: 包含时间显示、斐波那契数列计算等实用功能 +使用Maven构建项目: -## 技术栈 - -- **Java 17** - 项目使用Java 17特性 -- **Maven** - 项目构建和依赖管理 -- **Picocli 4.7.6** - 命令行参数解析和界面美化 - -## 项目结构 - -``` -cli-menu-app/ -├── pom.xml # Maven配置文件 -├── src/main/java/com/example/climenu/ -│ ├── Main.java # 主程序入口,处理交互式菜单 -│ └── MenuCommand.java # Picocli命令定义和逻辑实现 -└── target/ # 编译输出目录 +```bash +mvn clean compile assembly:single ``` -## 功能特性 +这将生成两个JAR文件: +1. `cli-menu-app-1.0-SNAPSHOT.jar` - 不包含依赖的JAR +2. `cli-menu-app-1.0-SNAPSHOT-jar-with-dependencies.jar` - 包含所有依赖的可执行JAR -### 1. 交互式菜单模式 -当不带参数运行程序时,进入交互式菜单: -- **选项1**: 显示当前时间 -- **选项2**: 计算斐波那契数列(可指定项数) -- **选项3**: 退出程序 +## 运行 -### 2. 命令行模式 -支持直接通过命令行参数调用功能: +### 交互式菜单模式 ```bash -# 显示帮助信息 -java -jar cli-menu-app.jar --help - -# 显示当前时间 -java -jar cli-menu-app.jar -t -java -jar cli-menu-app.jar --time - -# 计算斐波那契数列前10项 -java -jar cli-menu-app.jar -f 10 -java -jar cli-menu-app.jar --fib 10 +java -jar target/cli-menu-app-1.0-SNAPSHOT-jar-with-dependencies.jar ``` -## 快速开始 +### 命令行参数模式 -### 环境要求 -- Java 17 或更高版本 -- Maven 3.6+ (用于构建) - -### 构建项目 +显示当前时间: ```bash -mvn clean package +java -jar target/cli-menu-app-1.0-SNAPSHOT-jar-with-dependencies.jar -t ``` -### 运行程序 - -**方式1: 交互式菜单** +计算斐波那契数列: ```bash -java -jar target/cli-menu-app-1.0-SNAPSHOT.jar +java -jar target/cli-menu-app-1.0-SNAPSHOT-jar-with-dependencies.jar -f 5 ``` -**方式2: 命令行模式** +获取帮助信息: ```bash -# 显示帮助 -java -jar target/cli-menu-app-1.0-SNAPSHOT.jar --help - -# 使用功能 -java -jar target/cli-menu-app-1.0-SNAPSHOT.jar --time -java -jar target/cli-menu-app-1.0-SNAPSHOT.jar --fib 15 +java -jar target/cli-menu-app-1.0-SNAPSHOT-jar-with-dependencies.jar --help ``` -## 开发说明 - -### 核心类说明 - -#### Main.java -- 程序主入口点 -- 检测命令行参数,决定运行模式 -- 实现交互式菜单循环逻辑 - -#### MenuCommand.java -- 使用Picocli注解定义命令行参数 -- 实现具体的功能逻辑 -- 提供菜单显示方法 - -### 扩展功能 -要添加新功能,可以: -1. 在`MenuCommand.java`中添加新的`@Option`注解 -2. 在`call()`方法中实现功能逻辑 -3. 在`Main.java`的交互式菜单中添加对应选项 +## 开发环境运行 -## 示例输出 +使用Maven exec插件运行: -### 交互式菜单界面 -``` -======== 欢迎使用 CLI 菜单助手 ======== -1. 显示当前时间 -2. 计算斐波那契数列 -3. 退出程序 -======================================== - -提示: 运行 --help 查看详细帮助信息。 +交互式菜单: +```bash +mvn exec:java ``` -### 命令行输出示例 +或者指定参数: ```bash -$ java -jar cli-menu-app.jar --time -🕒 2025-11-13 10:30:45 - -$ java -jar cli-menu-app.jar --fib 5 -斐波那契数列(前5项): - 0 - 1 - 1 - 2 - 3 +mvn exec:java -Dexec.args="-t" +mvn exec:java -Dexec.args="-f 5" ``` -## 许可证 - -本项目仅供学习和演示使用。 \ No newline at end of file diff --git a/TODO.md b/TODO.md index 93a44924c7c3ce436f00c7bc6ca1051d992dda61..10e625e947a663e45db9dcc11bb86658844db191 100644 --- a/TODO.md +++ b/TODO.md @@ -2,15 +2,17 @@ 目前只能以 `mvn exec` 的方式运行,不能直接 `java -jar` 运行,例如以下命令是可以正常运行的: ```bash # 运行交互式菜单(静默) -mvn -q exec:java -Dexec.mainClass="com.example.climenu.Main" +mvn exec:java "-Dexec.mainClass=com.example.climenu.Main" # 直接显示时间(静默) -mvn -q exec:java -Dexec.mainClass="com.example.climenu.Main" -Dexec.args="-t" +mvn exec:java "-Dexec.mainClass=com.example.climenu.Main" "-Dexec.args=-t" # 直接计算斐波那契(静默) -mvn -q exec:java -Dexec.mainClass="com.example.climenu.Main" -Dexec.args="-f 5" -``` +mvn exec:java "-Dexec.mainClass=com.example.climenu.Main" "-Dexec.args=-f 5" +# 显示帮助信息 +mvn exec:java "-Dexec.mainClass=com.example.climenu.Main" "-Dexec.args=--help" +``` 但是如果直接 `java -jar` 运行,则会报错: ```bash java -jar target/cli-menu-app-1.0-SNAPSHOT.jar diff --git a/pom.xml b/pom.xml index 8e594bb01a36601873e8b046d8e495de70730963..f24c85c94058bce0fb1727ed14bf3079814f2d27 100644 --- a/pom.xml +++ b/pom.xml @@ -26,18 +26,40 @@ + + + org.codehaus.mojo + exec-maven-plugin + 3.6.2 + + com.example.climenu.Main + + + org.apache.maven.plugins - maven-jar-plugin - 3.3.0 + maven-assembly-plugin + 3.6.0 + + jar-with-dependencies + com.example.climenu.Main + + + make-assembly + package + + single + + + diff --git a/src/main/java/com/example/climenu/Main.java b/src/main/java/com/example/climenu/Main.java index 7724999ed2f05c5a8ca575dcd43fa8f557089257..cdb901c2feafc3b70c68eb5468bcdaa5ecc892f4 100644 --- a/src/main/java/com/example/climenu/Main.java +++ b/src/main/java/com/example/climenu/Main.java @@ -37,16 +37,13 @@ public class Main { try { String fibInput = scanner.nextLine().trim(); int n = Integer.parseInt(fibInput); - if (n <= 0) { - System.err.println(CommandLine.Help.Ansi.AUTO.string("@|red 请输入一个正整数。|@")); - break; - } - System.out.println(CommandLine.Help.Ansi.AUTO.string("@|yellow 斐波那契数列(前" + n + "项):|@")); - for (int i = 0; i < n; i++) { - System.out.println(" " + CommandLine.Help.Ansi.AUTO.string("@|cyan " + fibonacci(i) + "|@")); - } + // 统一处理流程:使用 MenuCommand 的 call 方法处理 + menuCmd.setFibonacciCount(n); + menuCmd.call(); } catch (NumberFormatException e) { - System.err.println(CommandLine.Help.Ansi.AUTO.string("@|red 输入无效,请输入一个数字。|@")); + // 统一处理流程:让 MenuCommand 的 call 方法处理错误 + menuCmd.setFibonacciCount(-1); // 设置无效值触发错误处理 + menuCmd.call(); } break; case "3": diff --git a/src/main/java/com/example/climenu/MenuCommand.java b/src/main/java/com/example/climenu/MenuCommand.java index 22b3841d26999e9dd73587ef5d9d876e4dfc9be4..139ccbd784ff45c3593a7832859d993e4b00e224 100644 --- a/src/main/java/com/example/climenu/MenuCommand.java +++ b/src/main/java/com/example/climenu/MenuCommand.java @@ -23,6 +23,11 @@ public class MenuCommand implements Callable { @Option(names = {"-f", "--fib"}, description = "计算斐波那契数列前N项", paramLabel = "COUNT") private Integer fibonacciCount; + // Add setter method for external access + public void setFibonacciCount(Integer fibonacciCount) { + this.fibonacciCount = fibonacciCount; + } + @Override public Integer call() { if (showTime) {