为java命令添加命令行参数 -- commons-cli的封装使用

简介

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);
        }

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值