Java利用Picocli开发一个简化命令行工具

 更新时间:2025年03月28日 09:48:54   作者:拾荒的小海螺  
Picocli 是一个强大、易用且功能丰富的 Java 库,用于开发命令行工具,本文我们就来为大家介绍一下Java如何利用Picocli进行命令行简化功能的吧

1、简述

Picocli 是一个强大、易用且功能丰富的 Java 库,用于开发命令行工具。它支持多级子命令、类型安全的参数解析和自动生成帮助信息,同时具有较低的学习曲线,是现代 CLI 应用开发的理想选择。

2、为什么选择 Picocli

简单易用:通过注解定义参数,减少手动解析逻辑。

强大功能:支持多种参数类型、子命令和多线程执行。

自动化:内置帮助信息和自动补全功能。

活跃社区:有详细的文档和大量实践案例。

Picocli 的核心功能:

  • 命令行参数解析:支持选项、位置参数、标志。
  • 多级子命令:轻松实现复杂的命令行结构。
  • 自动生成帮助信息:无需手动编写帮助文档。
  • 多线程支持:通过 @CommandLine.Command 中的 ExecutionStrategy 轻松实现并发任务。

3、实践样例

以下是一个实践案例,展示如何使用 Picocli 开发 CLI 工具,构建一个简单的文件操作命令行工具:

3.1 添加依赖

在 Maven 项目中添加 Picocli 的依赖:

<dependency>
    <groupId>info.picocli</groupId>
    <artifactId>picocli</artifactId>
    <version>4.7.4</version>
</dependency>

3.2 构建一个基本命令

下面创建一个简单的命令,支持对文件进行读取和统计操作。

import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.concurrent.Callable;

@Command(name = "filetool", version = "FileTool 1.0",
        description = "一个用于文件操作的命令行工具",
        mixinStandardHelpOptions = true)
public class FileTool implements Callable<Integer> {

    @Option(names = {"-p", "--path"}, description = "文件路径", required = true)
    private String filePath;

    @Option(names = {"-c", "--count-lines"}, description = "统计文件行数")
    private boolean countLines;

    @Option(names = {"-r", "--read-content"}, description = "读取并输出文件内容")
    private boolean readContent;

    @Override
    public Integer call() throws Exception {
        if (countLines) {
            long lineCount = Files.lines(Paths.get(filePath)).count();
            System.out.println("文件行数: " + lineCount);
        }

        if (readContent) {
            String content = new String(Files.readAllBytes(Paths.get(filePath)));
            System.out.println("文件内容:\n" + content);
        }

        return 0;
    }

    public static void main(String[] args) {
        int exitCode = new CommandLine(new FileTool()).execute(args);
        System.exit(exitCode);
    }
}

3.3 使用说明

编译并运行程序后,可以通过以下方式使用该工具:

查看帮助信息:

java -jar filetool.jar --help

输出示例:

用法: filetool [-hV] [-c] [-r] -p=<filePath>
一个用于文件操作的命令行工具
  -c, --count-lines     统计文件行数
  -h, --help            显示帮助信息
  -p, --path=<filePath> 文件路径
  -r, --read-content    读取并输出文件内容
  -V, --version         打印版本信息

统计文件行数:

java -jar filetool.jar -p sample.txt -c

输出示例:

文件行数: 10

读取文件内容:

java -jar filetool.jar -p sample.txt -r

输出示例:

文件内容:
Hello World!
This is a test file.

4、高级功能示例

Picocli 支持子命令,可以用于实现复杂的 CLI 工具。以下是一个示例,构建一个多功能工具,包含子命令 read 和 count:

@Command(name = "filetool", description = "文件工具", mixinStandardHelpOptions = true, subcommands = {
        FileReadCommand.class,
        FileCountCommand.class
})
public class FileTool {
    public static void main(String[] args) {
        int exitCode = new CommandLine(new FileTool()).execute(args);
        System.exit(exitCode);
    }
}

@Command(name = "read", description = "读取文件内容")
class FileReadCommand implements Callable<Integer> {
    @Option(names = {"-p", "--path"}, description = "文件路径", required = true)
    private String filePath;

    @Override
    public Integer call() throws Exception {
        String content = new String(Files.readAllBytes(Paths.get(filePath)));
        System.out.println("文件内容:\n" + content);
        return 0;
    }
}

@Command(name = "count", description = "统计文件行数")
class FileCountCommand implements Callable<Integer> {
    @Option(names = {"-p", "--path"}, description = "文件路径", required = true)
    private String filePath;

    @Override
    public Integer call() throws Exception {
        long lineCount = Files.lines(Paths.get(filePath)).count();
        System.out.println("文件行数: " + lineCount);
        return 0;
    }
}

运行示例:

查看帮助信息:

java -jar filetool.jar --help

使用子命令 read:

java -jar filetool.jar read -p sample.txt

使用子命令 count:

java -jar filetool.jar count -p sample.txt

5、总结

Picocli 是一个现代化的 Java 命令行工具开发库,通过简单的注解和直观的 API 提供强大的功能。无论是实现单一命令,还是构建多级子命令的复杂工具,Picocli 都能快速满足需求。

推荐的使用场景:

开发运维工具:如文件管理工具、数据处理工具。

数据分析脚本:支持多线程处理。

多子命令的框架型 CLI 工具。

到此这篇关于Java利用Picocli开发一个简化命令行工具的文章就介绍到这了,更多相关Java Picocli简化命令行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot嵌套事务详解及失效解决方案

    SpringBoot嵌套事务详解及失效解决方案

    在复杂的业务场景中,嵌套事务可以帮助我们更加精细地控制数据的一致性,然而,在 Spring Boot 中,如果嵌套事务的配置不当,可能会导致事务不生效的问题,尤其是在同一个类中进行方法调用时,本文将详细介绍嵌套事务的原理、失效的原因以及解决方案
    2025-01-01
  • Java基于logback MessageConverter实现日志脱敏方案分析

    Java基于logback MessageConverter实现日志脱敏方案分析

    本文介绍了一种日志脱敏方案,即基于logbackMessageConverter和正则匹配的方法,该方法的优点是侵入性低,工作量少,只需修改xml配置文件,适用于老项目,感兴趣的朋友跟随小编一起看看吧
    2024-10-10
  • Java Hutool(糊涂)工具类索引详解

    Java Hutool(糊涂)工具类索引详解

    这篇文章主要介绍了Java Hutool(糊涂)工具类索引,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Spring boot实现一个简单的ioc(2)

    Spring boot实现一个简单的ioc(2)

    这篇文章主要为大家详细介绍了Spring boot实现一个简单ioc的第二篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • maven打生产环境可执行包的实现

    maven打生产环境可执行包的实现

    本文主要介绍了maven打生产环境可执行包的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • 基于UDP实现聊天室功能

    基于UDP实现聊天室功能

    这篇文章主要为大家详细介绍了基于UDP实现聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • 解决springSecurity 使用默认登陆界面登录后无法跳转问题

    解决springSecurity 使用默认登陆界面登录后无法跳转问题

    这篇文章主要介绍了解决springSecurity 使用默认登陆界面登录后无法跳转问题,项目环境springboot下使用springSecurity 版本2.7.8,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2023-12-12
  • Java读取邮件的方法

    Java读取邮件的方法

    这篇文章主要介绍了Java读取邮件的方法,以163邮件服务器为例说明了Java读取邮件的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • mybatis实现图书管理系统

    mybatis实现图书管理系统

    这篇文章主要为大家详细介绍了mybatis实现图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • win10安装JDK14.0.2的详细安装过程

    win10安装JDK14.0.2的详细安装过程

    这篇文章主要介绍了win10安装JDK14.0.2的详细安装过程的相关资料,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09

最新评论