JAVA基础 - 使用CommandLine解析命令行参数

它是什么

commons-cli 是一个强大而的开源的命令行参数传递与解析的解决方案,用于接收MAIN方法的args参数。可以通过设置短选项(即选项名简写)、长选项(即全写)、设置是否需要携带选项参数(指定为 false 时,表示此选项不带参数,即为布尔选项)和描述信息来定义参数选项。
官网:https://commons.apache.org/proper/commons-cli/index.html

请先阅读该博文:
CENTOS下的命令行参数:https://blog.csdn.net/goodjava2007/article/details/131083116

编码步骤

(1)定义参数

Options options = new Options();

(2)解析参数

CommandLine cmd = new BasicParser().parse(options, args);
// 或者
CommandLine cmd = new DefaultParser().parse(options, args);
// 或者
CommandLine cmd = new PosixParser().parse(options, args);
// 或者
CommandLine cmd = new GnuParser().parse(options, args);

(3)获取参数

String db = cmd.getOptionValue("d")

参数风格

序号 风格类型 参数描述 解析器
1 POSIX风格参数 以“-”开头的单个字符的POSIX风格的参数,如:tar -zxvf foo.tar.gz PosixParser
2 GNU风格参数 以“- -”后接选项关键字的GNU风格的参数,GNU风格兼容POSIX风格,如:du - -human-readable - -max-depth=1 GnuParser
3 JAVA风格参数 以“-D”开头的参数,如:java -Datlas.log.file=import-hive.log -Dlog4j.configuration=atlas-hive-import-log4j.xml DefaultParser
4 短选项参数 以“-”开头的单个字符参数,即:横杠+参数名+空格+参数值(空格也可以不带),如:import-hive.sh -dmallx -tmallx_order 或者 import-hive.sh -d mallx -t mallx_order 都可以 DefaultParser / BasicParser
5 长选项参数 以“-”开头的多个字符参数,如:ant -projecthelp DefaultParser / BasicParser

注:以上表格说明的是参数风格,至于某个参数后面是否带参数对应的值,需要在选项的代码中进行设置。

如何使用

① 依赖引入
<dependency>
  <groupId>commons-cli</groupId>
  <artifactId>commons-cli</artifactId>
  <version>1.4</version>
</dependency>
② 示例代码
public class MyCommandLine {

    public static void main(String[] args) {
        MyCommandLine mcl = new MyCommandLine();
        mcl.defaultParser(args);
    }


    private void defaultParser(String[] args) {
        Options options = new Options();
        try {

            // 1.1 构造参数
            options.addOption("help", "如何使用mcl指令");
            options.addOption("d", "database", true, "指定数据库名");
            options.addOption("t", "table", true, "指定表名");
            options.addOption("s", "size", true, "指定文件的大小");
            options.addOption("f", "filename", true, "指定文件的全路径名");
            options.addOption("failOnError", false, "指定出现错误是是否停止");

            Option property = Option.builder("D")
                    .argName("property=value")
                    .hasArgs()
                    .valueSeparator('=')
                    .desc("指定KEY=VALUE形式的参数")
                    .build();

            options.addOption(property);


            // 1.2 解析
            CommandLine cmd = new DefaultParser().parse(options, args);

            // 1.3 取值
            boolean failOnError = cmd.hasOption("failOnError");
            String db = cmd.getOptionValue("d");       // 数据库
            String table = cmd.getOptionValue("t");    // 表
            String size = cmd.getOptionValue("s");     // 表大小
            String file = cmd.getOptionValue("f");     // 文件
            String log = cmd.getOptionProperties("D").getProperty("atlas.log");
            // 以下仅仅用于测试
            // 输出USAGE
            System.out.println(getHelp(options));
            // 输出参数
            System.out.println(String.format("The db is: %s, table is: %s, size is : %s, file is: %s, log is %s", db, table, size, file, log));
        } catch (Exception e) {

        } finally {

        }
    }

    private String getHelp(Options options) {
        HelpFormatter helper = new HelpFormatter();

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        PrintWriter printWriter = new PrintWriter(byteArrayOutputStream);
        helper.printHelp(printWriter, HelpFormatter.DEFAULT_WIDTH, "mcl -help", null,
                options, HelpFormatter.DEFAULT_LEFT_PAD, HelpFormatter.DEFAULT_DESC_PAD, null);
        printWriter.flush();
        String help = new String(byteArrayOutputStream.toByteArray());
        printWriter.close();
        return help;
    }
}
③ 示例测试

在IDEA中进行参数设置,如下:

"Program arguments" 输入框中如下设置:
-d mallx -tmallx_order -s1000 -Datlas.log=import-hive.log -f D:\02-工作空间\06-代码空间\04-gitee\rills-atlas-2.1.0-rc3\README.txt

JAVA基础 - 使用CommandLine解析命令行参数_第1张图片

④ 执行结果
usage: mcl -help
 -d,--database <arg>   指定数据库名
 -D <property=value>   指定KEY=VALUE形式的参数
 -f,--filename <arg>   指定文件的全路径名
 -failOnError          指定出现错误是是否停止
 -help                 如何使用mcl指令
 -s,--size <arg>       指定文件的大小
 -t,--table <arg>      指定表名

The db is: mallx, table is: mallx_order, size is : 1000, file is: D:\02-工作空间\06-代码空间\04-gitee\rills-atlas-2.1.0-rc3\README.txt, log is import-hive.log
⑤ 官方示例

COMMONS CLI 官方示例:https://commons.apache.org/proper/commons-cli/usage.html

你可能感兴趣的:(JAVA基础知识,java,开发语言)