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 万行的代码,我不禁要问后续代码容易维护吗