Jakarta Commons CLI というコマンドラインオプション解析のためのライブラリが存在します. この CLI はコマンドラインオプションを解析するために, 定義,解析,利用の 3 つの段階を経て利用します.
getopt Java port に比べて,自由度が高く,また,オブジェクト指向的なクラス構成ですので, 便利なライブラリです.
しかし,CLI を利用するのに,個人的にどうしてもイタダケない部分があります. それは 3 つの段階の 1 つ目,定義の部分です. 例えば ls の block-size オプションを指定するには以下のコードを書かなければなりません.
options.addOption( OptionBuilder.withLongOpt( "block-size" )
.withDescription( "use SIZE-byte blocks" )
.withValueSeparator( '=' )
.hasArg()
.create() );
こんなコードが延々と続くとイヤになってしまいます.
この CLI+ はこのようなものを XML で書いておき, 簡単に CLI の定義部分をこなしてしまおうというものです.
ただし,まだこなれていません.クラス構成も結構いい加減なので.
「無償・無保証・著作権放棄」です. いわゆるパブリックドメインです.
XML の構造は以下のような形です.
<cli-def name="sample">
<definition>
<option-def name="optionname">
<opt>o</opt>
<longopt>longopt</longopt>
<!-- 引数を持つかどうかを次の 3 つから選択する.REQUIRE, OPTIONAL, NONE -->
<argument>REQUIRE</argument> <!-- なかったら NONE -->
<argname>argument</argname>
<description>some description</description>
<!-- 引数の区切り文字.
1 文字より長い文字列を指定しても 1 文字目しか選ばれない.
<value-separator>=</value-separator>
-->
<!-- 必須オプションならば,指定する.
<require />
-->
<!-- どのように使うかがわからないので,未実装.
XML 中に現れても無視されます.
<type>type</type>
<multiple-args />
<args />
<arg />
-->
</option-def>
</definition>
<options>
<option>optionname</option>
<!--
相互排他的なオプションの場合は以下のように group で囲む.
すると,OptionGroup に加えてくれる.
<group>
<option>opt1</option>
<option>opt2</option>
</group>
-->
</options>
</cli-def>
もし,上記の XML ファイルを CLI+ で読み込み, HelpFormatter にかけると以下のような出力が得られます.
-o,--longopt <argument> some description
このように必要なだけ <option-def> を書き,
<options> の内容の <option> に
name(上記の XML では optionname) を加えれば,それが
Options に加えられます.
上記のオプションの <option-def>
の部分で必要ないものがあれば,記述する必要はありません.
必須なのは <option-def> の属性の name のみです.
とは言うものの,<option-def>
の中身が全くないということはありえないので,
実装としては,何かしら書かれていることが前提となっていますが.
少なくとも <opt> か <longopt>
のどちらかが必要です.
| コンテンツ |
|---|
| リンク |
| 目次 |
| リンク |