5
2

More than 3 years have passed since last update.

ApacheのCommons CLIでコマンドラインオプション解析をする。

Last updated at Posted at 2019-02-17
Apache Commons CLIとは

コマンドラインオプションを解析するAPIです。

例えば、hoge.jarを実行する際に3つのオプションがあるとします。
java -jar /usr/local/hoge.jar user age mail

で、このうち
・userはオプションを2つ取りたい
・age(年齢)は必須にしたい
・オプションが間違っている場合は指定するオプション情報(ヘルプ)を返したい

という要望に答えてくれるAPIがApache Commons CLIです。

導入してみる

次の環境にて導入してみました。
・java 1.8
・maven構成

pom.xml
    <dependency>
        <groupId>commons-cli</groupId>
        <artifactId>commons-cli</artifactId>
        <version>1.4</version>
    </dependency>
        Options.addOption(Option.builder("u")     // オプションの名前
        .argName("serviceid"))                    // 引数名
        .hasArg(2)                                // 引数を2つとる。
        .desc("ユーザー")                          // 説明
        .build());                                // インスタンスを生成
        Options.addOption(Option.builder("a")
        .argName("age"))
        .required()                               // 必須
        .hasArg()
        .desc("年齢")
        .build());
        // オプションのヘルプ情報を表示する。
        HelpFormatter hf = new HelpFormatter();
        hf.printHelp("[opts]", options);
        // コマンドライン解析
        CommandLineParser parser = new DefaultParser();
        CommandLine cmd = null;
        try {
            cmd = parser.parse(options, args);
        } catch (ParseException e) {
            log.error("cmd parser failed." , e);
        // ユーザー
        cmd.hasOption("u");
        log.info("ユーザー["+String.join(",", cmd.getOptionValues("u"))+"]");
        // 年齢
        cmd.hasOption("a");
        log.info("年齢["+String.join(",", cmd.getOptionValues("a"))+"]");
        // メールアドレス
        cmd.hasOption("m");
        log.info("メールアドレス["+String.join(",", cmd.getOptionValues("m"))+"]");

次の引数で実行してみる。
-a 18 -u edy jeff -m hogehoge@mail.jp

console.log
usage: [opts]
 -a <age>    年齢
 -m <arg>    メールアドレス
 -u <user>   ユーザー
INFO App - ユーザー[edy,jeff] (App.java:67)
INFO App - 年齢[18] (App.java:71)
INFO App - メールアドレス[hogehoge@mail.jp] (App.java:75)
 -u <user>   ユーザー
ERROR App - cmd parser failed. (App.java:62)
org.apache.commons.cli.MissingOptionException: Missing required option: a
    at org.apache.commons.cli.DefaultParser.checkRequiredOptions(DefaultParser.java:199)
    at org.apache.commons.cli.DefaultParser.parse(DefaultParser.java:130)
    at org.apache.commons.cli.DefaultParser.parse(DefaultParser.java:76)
    at org.apache.commons.cli.DefaultParser.parse(DefaultParser.java:60)
    at free_dom.test.App.main(App.java:60)
Exception in thread "main" java.lang.NullPointerException
    at free_dom.test.App.main(App.java:66)
      .build()

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2