バージョン1.2について記述しています。2015年5月時点の最新版であるバージョン1.3ではライブラリが提供するインターフェースに大きな変更がありました。この点についてはこちらの記事で若干言及しています。Javaでコマンドライン・アプリを作成する場合、コマンドライン引数とオプションの機能を実現するためにいくつかのライブラリを利用できる*1。CLIを使ってみる*2。使用したのは最新版のバージョン1.2。こちらからjarファイルをダウンロードできる。公式サイトで公開されているチュートリアルについてはこちらで訳出している(2013/03/12追記)。コマンドライン・オプションを定義する作成するJavaコマンドライン・アプリがどんなオプションをとるかは、Optionsオブジェクトを使って定義する。Options();Optionsオブジェクトを初期化する方法は2通りあって、1つはOptionsに直接オプションを追加していく方法。このために以下のメソッドが用意されている*3。Interface)を使ってOptionオブジェクトを作成して、これをOptionsオブジェクトに追加していく方法。);options.addOption(logfile);2つ目の方法のほうが各オプションの挙動を詳細に設定できるし、“流れるようなインターフェース”のおかげでコードの可読性は高い。上記の(OptionBuilderの)各種メソッドがクラスメソッドであるのに対して、これらメソッドが返すのはOptionBuilderインスタンス。よって、上記コードは"static-access"警告の対象になる。アノテーションを使って警告出力抑制をしてしまえばいい。ないなら、一度OptionBuilder型変数にインスタンスを受けた後に、各種メソッドを呼び出すなりすればいい。ところで2つの方法ともに関係してくるOptionの各種設定値について確認。例として、ここでは作成するコマンドライン・アプリがMyCmdで、-oとか-pとかのオプションをとり、foobarとかの任意のコマンド引数を1つとるとする。-oはオプション引数を1つとる。それから-pはフラグオプションであり、オプション引数はとらない。<command-argument>これに対してOptionBuilderの各種メソッドで示された名称と意味は以下のようになる。そのオプションが引数をとるかどうかを決定するもの。"-o"オプションであればこのメソッドを引数なしでコールするか、trueを引数にしてコールすることになる。"-p"オプションであればそもそもこのメソッドをコールしないか、あえてするならばfalseを引数にしてコールする。(int型をとる多重定義メソッドもあって、この場合はオプション引数としてとる値の個数のリミットを設定できる模様。そのオプションが必須のものであるかどうかを決定するもの。hasArgメソッド同様にあえてboolean型の引数を設定することもできる。このメソッドはヘルプとか使用方法の表示に関わってくるメタ情報を設定するもので、上記の例で言えば"option-argument"の部分を決定するもの。withArgNameと同じくヘルプとか使用方法の表示に関わってくるメタ情報を設定するもの。"--help"などのようにイニシャルではなくワードを用いて指定する場合の名前を設定するもの。これを設定しない場合どうなるのかよくわからないが、実際のところアプリのユーザのためにもコードの可読性のためにも、設定しておいた方がいいと思う。このメソッドによりOption型インスタンスが得られる。'o'とか'p'とかの文字を設定する。前掲の例のように文字列でもよい。コマンドライン・オプションとコマンドライン引数をパースするオプションを定義し終えたら、mainメソッドに渡された引数String[]とともにCommandLineParserインターフェース実装のparseメソッドに渡す。CLIプロジェクトで配布しているJarにはあらかじめいくつかのParser実装クラスが含まれている*4。foobar"みたいにフラグオプションを他のオプションにまとめ込むことができる)。このほかにどんなデフォルト実装が存在するかはここで確認できる。args);あとはCommandLineオブジェクトを通じてコマンドライン・オプションとコマンドライン引数を取得する。いかなるオプションにも紐付かない引数をString[]として取得できる。コマンドライン・オプションやコマンドライン・オプション引数ではない、コマンドライン引数そのもののみを取得できる。MyCmdの例でいえば"foobar"が格納された配列が返される。第1引数にオプション名を指定してオプション引数を取得する。第2引数をとる多重定義メソッドが存在して、こちらは第2引数を設定することで、オプションが設定されていないときのデフォルト値とすることができる。オプション名を引数にとって、そのオプションがコマンドラインで入力されたかどうかをチェックできる。"-p"のようなフラグオプションが設定されているかどうかを確認できる。ちなみにオプション引数をとるオプションであっても、コマンドラインでその引数が指定されなかったからと言って、CLIのレベルで即時エラー、とはならない。このようなとき、getOptionValueメソッドをデフォルト値を与えずコールすると、nullが返ってくる。このときのエラーハンドリングはCLIを使用して開発を行うユーザ=デベロッパに任されている(2013/03/12追記)。ヘルプ/使用方法を表示する最後に、ヘルプもしくは使用方法を表示する方法について。コマンドライン・アプリが引数なしで実行された場合とか、必要なオプションを欠いたかたちで実行された場合とかに、アプリの使用方法を表示する場合があると思う。"-h"とか"--help"とかのオプションを定義しておいて、実行時にこれらが設定されていた場合に、使用方法を表示するなんて場合もそう。このような場合に定型の表示をしてくれるユーティリティにHelpFormatterがいる。options);上記のようにしてOptionsインスタンスを引数にして呼び出すことで、Optionオブジェクト生成時に設定した情報をもとにして使用方法のテキストを自動整形して標準出力に出力してくれる。*1:今回使用したCLIとは異なるアプローチをしているライブラリとしてJArgpがある。実用的なリフレクション」が参考になる。Interfaceってことらしい。*3:ほかにも引数を省略した簡略版メソッドが提供されている。*4:けれどもこのページで登場するDefaultParserなるクラスはバージョン1.2のjar内には存在しない・・・。Badgesはてなブログをはじめよう!m12iさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。