相信每个Java程序员都曾使用过Scanner
,因编写出一个命令行程序而兴奋不已。
命令行程序也颇为实用,然而,使用Java来编写一个功能强大的命令行程序却并不容易,主要有以下几方面的痛点:
- 没有成熟的框架来封装参数接收、参数提示以及参数校验
- 很难处理参数的互斥以及特定命令的相互依赖关系
- 无法进行命令自动补全
- 由于JVM解释执行字节码,并且JIT无法在短时执行中发挥作用,Java命令行程序启动缓慢
- 集成SpringBoot及其它组件后,启动更加缓慢
上述这些问题都可以使用Picocli来解决
本文主要向大家介绍Picocli,以及分析它是如何解决上述的问题,并介绍使用其构建一个控制台程序的基本流程,详细的使用指南请至官方文档。
基本介绍
Picocli 致力于以最简洁的方式来创建一个基于JVM的功能强大的命令行程序。
Picocli aims to be the easiest way to create rich command line applications that can run on and off the JVM.
下图是利用Picocli构建命令行程序,输出 checksum -h
后打印出的帮助文档:
快速开始
定义一个命令有两种方式:
- 使用成员属性来接收命令行参数,实现
Callable
接口并覆写call()
方法定义业务流程 - 使用类方法的参数来接收命令行参数,方法内部就是业务流程,个人推荐这种。
以下是两种定义方法:
实现Callable接口
// 定义checksum命令,以及命令的提示信息
@Command(name = "checksum", mixinStandardHelpOptions = true, version = "checksum 4.0",
description = "Prints the checksum (MD5 by default) of a file to STDOUT.")
class CheckSum implements Callable<Integer> {
@Parameters(index = "0", description = "The file whose checksum to calculate.")
private File file;
@Option(names = {
"-a", "--algorithm"}, description = "MD5, SHA-1, SHA-256, ...")
private String algorithm = "MD5";
@Override
public Integer call() throws Exception {
// your business logic goes here...
byte[] fileContents = Files.readAllBytes(