简介
common-cli组件是Apache组织提供的一个解析命令参数的jar包,它能解析gnu风格参数、posix风格参数。精简而又强大,大小仅由二十多个class组成,maven地址如下:
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>${commons-cli.version}</version>
</dependency>
在实际项目中,往往会对这个common-cli组件进行封装,让其更容易使用。
效果展示
java CommandCli -start 20200330000000 -end 20200401000000
其中,CommandCli 是一个有main方法的可执行类, start 和 end 是自定义的命令行参数。
封装过程
1. 新建一个inerface叫 CliRunner,。
定义3个抽象方法,initOptions()用来添加命令行的option, validateOptions()用来验证每个option的值是否合法,start()则用来执行带options的java命令。
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Options;
public interface CliRunner {
Options initOptions();
boolean validateOptions(CommandLine var1);
void start(CommandLine var1);
}
2. 在自己的类中实现接口。
假设这个类叫做CommandCli,则实现代码如下
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Options;
@Slf4j
public class CommandCli implements CliRunner {
private static final String START = "start";
private static final String END = "end";
/**
* 新建AdvCli类,在此类中控制命令行的初始化、验证、执行等流程,还可以在此类中定义公用的参数
* Main方法用AdvCli定义的方法
* @param args
*/
public static void main(String[] args) {
AdvCli.initRunner(args, CommandCli.class.getSimpleName(), new CommandCli());
}
/**
* 添加命令行参数,例如start,end, 在命令行中 java CommandCli -start 20200330000000 -end 20200401000000
* @return 命令行参数
*/
@Override
public Options initOptions() {
Options options = new Options();
options.addOption(START, true, "开始时间yyyyMMddHHmmSS");
options.addOption(END, true, "结束时间yyyyMMddHHmmSS");
return options;
}
/**
* 定义命令行参数的验证方法
* @param cmdLine
* @return true为通过,false为不通过
*/
@Override
public boolean validateOptions(CommandLine cmdLine) {
return (cmdLine.hasOption(START) && cmdLine.hasOption(END)) ;
}
/**
* 业务逻辑处理
* @param cmdLine
*/
@Override
public void start(CommandLine cmdLine) {
String start = null;
String end = null;
if (cmdLine.hasOption(AdvCli.CLI_PARAM_S) && cmdLine.hasOption(AdvCli.CLI_PARAM_E)) {
start = cmdLine.getOptionValue(AdvCli.CLI_PARAM_S);
end = cmdLine.getOptionValue(AdvCli.CLI_PARAM_E);
} else {
throw new RuntimeException("时间必须设置 ");
}
//开始你的业务逻辑
}
}
3. 新建AdvCli类。
在此类中控制命令行的初始化、验证、执行等流程,还可以在此类中定义公用的参数
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class AdvCli {
public static final String CLI_PARAM_C = "c";
public static final String CLI_PARAM_D = "d";
public static final String CLI_PARAM_A = "a";
public static final String CLI_PARAM_F = "f";
public static final String CLI_PARAM_L = "l";
public static final String CLI_PARAM_H = "h";
private static HelpFormatter formatter = new HelpFormatter();
public AdvCli() {
}
public static void initRunner(String[] args, String cmdName, CliRunner runner) {
CommandLineParser parser = new GnuParser();
Options options = runner.initOptions();
try {
CommandLine cmdLine = parser.parse(options, args);
if (!runner.validateOptions(cmdLine) || cmdLine.hasOption("help")) {
formatter.printHelp(cmdName, options);
return;
}
runner.start(cmdLine);
} catch (ParseException var6) {
System.out.println("Unexpected exception:" + var6.getMessage());
formatter.printHelp(cmdName, options);
}
}
}