Commons

作成 2003/2/18

CLI

Commons CLIって?

CLIは、Command Line Interfaceの略で、 Javaアプリケーションの引数をパースするライブラリです。 例えば、

Java SomeApp -a -size=600 -c
とかいうJavaアプリの引数解析を行う共通のインターフェイスと いくつかのパーサーの実装が提供されています。 最近ツール作りがたまにあるので、 ちょっと調べてみました。

簡単な例

ドキュメントに簡単なサンプルが載っていたので、 そのとおりに実装してみました。 現在日付(or時間)を表示するJavaアプリケーションです。

DateApp.java

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.apache.commons.cli.*;


/**
 * CLIの練習
 */
public class DateApp {

  public static void main(String[] args) {

    Options options = new Options();
    options.addOption("t", false, "display current time");
    //options.addOption("c", true, "by locale");
    options.addOption(OptionBuilder
                .withArgName("locale")
                .hasArg()
                .withDescription(  "with locale" )
                .create( "c") );
    
    options.addOption("h", false, "display help");
    
    CommandLineParser parser 
      = new BasicParser();
      //= new PosixParser();
      //= new GnuParser();

    try {
      CommandLine cl = parser.parse(options, args);


      if(cl.hasOption("h") ){
        HelpFormatter formatter = new HelpFormatter();
        formatter.printHelp( "Test1", options, true);
        return;
      }

      DateFormat df;
      Locale locale;

      String countryCode = cl.getOptionValue("c");
      if (countryCode == null) {
        locale = Locale.getDefault();
      } else {
        locale = new Locale(countryCode);
      }

      if (cl.hasOption("t")) {
        df = DateFormat.getTimeInstance(DateFormat.FULL, locale);
      } else {
        df = DateFormat.getDateInstance(DateFormat.FULL, locale);
      }

      System.out.println(df.format(new Date()));

    } catch (ParseException e) {
      e.printStackTrace();
    }

  }
}

実行結果

C:\apps\eclipse\workspace\cli01>java DateApp
2003年2月18日 (火曜日)

C:\apps\eclipse\workspace\cli01>java DateApp -t
22時36分56秒 JST

C:\apps\eclipse\workspace\cli01>java DateApp -t -c en
10:58:42 PM JST

C:\apps\eclipse\workspace\cli01>java DateApp -h
usage: Test1 [-h] [-c locale] [-t]
 -c <locale>   with locale
 -h            display help
 -t            display current time

tオプションで、時間表示(指定しなければ日付表示)、 cオプションはロケール引数付で指定したロケールで表示、 hオプションはヘルプ。

Optionの引数

Options#addOption(...)のboolean引数は、 オプションにパラメータがあるかどうかを指定します。 ただし、この方法だと、help表示時にパラメータの説明にnullが表示されます。 説明をつけるには、OptionBuilderを使います。

ヘルプ

ヘルプはHelpFormatterで簡単に表示できます。

パーサー

BasicParser以外に、PosixParser、GUNParserがあります。 各パーサーの違いはflattenメソッドの違いで、 オプションやパラメータの書式が若干異なるようです(-c xxxが-cxxxになったり)。

感想

自分で引数をパースしても、 それほど手間でもないですが、 オプションとパラメータ解析の仕組みが整っているCLIを 使ってみるのもいいかもしれません。 とりあえず、さわりだけ。 実際に使う機会があればもうちょっと調べようと思います。

参考

ドキュメントはUsage Scenariosがわかりやすいです。 翻訳で概要を抑えて、若干バージョンが上がっている(?ドキュメントが増えている) 公式サイトを見るのがいいかも。

Jakarata Commons CLI
公式サイト

Jakartaの杜 Commons CLI
翻訳サイト


TOP