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 @Transactional使用时需注意的几个问题记录

    Springboot @Transactional使用时需注意的几个问题记录

    本文详细介绍了Spring Boot中使用`@Transactional`注解进行事务管理的多个方面,包括事务的隔离级别(如REPEATABLE_READ)和传播行为(如REQUIRES_NEW),并指出了在同一个类中调用事务方法时可能遇到的问题以及解决方案,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • Java动态获取实现类的方式详解

    Java动态获取实现类的方式详解

    这篇文章主要介绍了Java动态获取实现类的方式详解,文中通过示例代码介绍的非常详细,对大家的学习或工作有一定的参考价值,需要的朋友们下面随着小编来一起学习吧
    2024-01-01
  • IDEA 项目创建Mapper的xml文件的方法

    IDEA 项目创建Mapper的xml文件的方法

    这篇文章主要介绍了IDEA 项目创建Mapper的xml文件的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Spring Boot MyBatis 操作数据库的实战指南

    Spring Boot MyBatis 操作数据库的实战指南

    本文详细介绍了SpringBoot环境下MyBatis的集成与应用,从传统JDBC的局限性出发,展示了MyBatis的日志配置、CRUD操作、自增主键返回、多表查询等功能,感兴趣的朋友跟随小编一起看看吧
    2026-05-05
  • java写卷积神经网络(CupCnn简介)

    java写卷积神经网络(CupCnn简介)

    这篇文章主要介绍了java写卷积神经网络(CupCnn简介),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 使用SpringSecurity处理CSRF攻击的方法步骤

    使用SpringSecurity处理CSRF攻击的方法步骤

    这篇文章主要介绍了使用SpringSecurity处理CSRF攻击的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Java基础之方法重写详解

    Java基础之方法重写详解

    这篇文章主要介绍了Java基础之方法重写详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • Java中各类日期和时间转换超详析总结(Date和LocalDateTime相互转换等)

    Java中各类日期和时间转换超详析总结(Date和LocalDateTime相互转换等)

    这篇文章主要介绍了Java中日期和时间处理的几个阶段,包括java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp、java.util.Calendar和java.util.GregorianCalendar等类,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • 浅谈Strut2如何对请求参数的封装

    浅谈Strut2如何对请求参数的封装

    这篇文章主要介绍了浅谈Strut2如何对请求参数的封装,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • Java的Object类九个方法技巧

    Java的Object类九个方法技巧

    这篇文章主要介绍了Java的Object类九个方法技巧,Java的Object 类的完整路径是java.lang.Object ,是所有类的父类编译,下文相关资料,需要的朋友可以参考一下
    2022-04-04

最新评论