天天看点

Java 命令行参数解析方式探索(三):Picocli

作者:冰心de小屋

Picocli 同样一款命令行参数解析工具,通过注解方式编程,该工具轻量、代码侵入少、功能强大和容易扩展,主要体现在:

  • 解析过程提供了多个切入点,方便开发者介入;
  • 参数的解析有着更好的容错性;
  • 多种语法糖更加自由的声明参数;
  • 对于某些框架可以快速集成,例如依赖注入框架 Spring 和 Guice 等。

下面来介绍下如何使用,首先 maven 中引入依赖:

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

           

复制代码

定义命令行参数:

package com.ice.impl;


import com.ice.Parameter;
import lombok.Getter;
import picocli.CommandLine;


import java.util.Map;


@Getter
public class PicocliParameter implements Parameter {
    @CommandLine.Option(names = {"-h", "--help"}, description = "输出帮助信息")
    private boolean help;


    @CommandLine.Option(names = {"-t", "--thread"}, description = "并发数", required = true)
    private int thread;


    @CommandLine.Option(names = {"-c", "--count"}, description = "调用次数", required = true)
    private int count;


    @CommandLine.Option(names = {"-s", "--second"}, description = "调用时长:单位秒", required = true)
    private int second;


    @CommandLine.Option(names = {"-p", "--property"}, description = "自定义扩展属性", type = {String.class, String.class})
    private Map<String, String> property;


    @CommandLine.Option(names = {"-o", "--output"}, description = "结果输出到文件中")
    private int output;
}

           

复制代码

解析执行:

package com.ice.impl;


import com.ice.Parameter;
import com.ice.Starter;
import picocli.CommandLine;


public class PicocliStarter extends Starter {
    public PicocliStarter(String[] args) {
        super(args);
    }


    public Parameter parse() {
        PicocliParameter parameter = new PicocliParameter();
        CommandLine commandLine = new CommandLine(parameter);
        commandLine.parseArgs(args);
        return parameter;
    }


    public static void main(String[] args) {
        Starter starter = new PicocliStarter(args);
        starter.run();
    }
}

           

复制代码

总结:基于注解方式声明命令行参数清晰明了,集成代码编写起来更加简单,但是 Picocli 的编码风格不太推崇,CommandLine 内部定义了大量的类,几乎所有的功能 CommandLine 类都实现了,该类居然有 1.9 万行的代码,我不禁要问后续代码容易维护吗

继续阅读