#args4jとは
コマンドライン引数の解釈をしてくれるライブラリです。
http://args4j.kohsuke.org/
ex) java example.class hoge fuga -foo bar
class以降の文字列がコマンドライン引数
#前提
執筆時点最新のver2.33を使います。
使い方
使うこと自体はいたって簡単3ステップ
- 読込先 兼 定義のクラスを用意
- パーサーのインスタンスを生成
- メソッド起動
以上
beanに入っているのであとは煮るなり焼くなりお好みで
import org.kohsuke.args4j.Option;
/**
* コマンドライン引数の格納先兼定義
*/
public class ArgBean {
@Option(name = "-f")
public Boolean flag;
}
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
public class Example {
public static void main(String ... args) throws CmdLineException {
//beanインスタンス生成
ArgBean bean = new ArgBean();
//パーサーインスタンス生成
CmdLineParser perser = new CmdLineParser(bean);
//パース実行
perser.parseArgument(args);
//画面表示 オプションが指定されていればtrue,されていなければnull
System.out.println(bean.flag);
}
}
読込先クラスの設定
読込先クラスでは、フィールドへアノテーションを付与することにより、コマンドライン引数の解釈方法を制御する。
引数は名前の有無で2つのアノテーションを使い分ける。
どちらにも、handlerがあるがString,数値系プリミティブとそのラッパー型,列挙型(Enum)であればなしで動く
Option
名前付き引数に対して使用するアノテーション
name
必須項目 この項目の名称を指定する
先頭は必ず、「-」にすること
org.kohsuke.args4j.CmdLineParser#isOption(String arg)
でArgument扱いされてしまうことを避けるため
@Option(name="hoge")
public Boolean flag;
次の起動でflagがtrueになる
java example hoge
Argument
名前なし引数に対して使用するアノテーション
index
何番目に出現するかを指定する。配列と同じく0スタート
デフォルトが0指定されているため省略可能
@Option(index="0")
//↑↓同じ
//@Option
public String str;
次の起動でstrがfooになる
java example foo
#使用時の注意事項
- usageはparse実行後の場合、上書きされる。
- 出力時はparse前か新しい読込先・パーサーインスタンスを用意すること
参考先
#余談
- サンプルの通りフィールドのみでも構成でき、読込先クラスはbeanとは呼べないような気もしますが今回の記事の範囲では言及しないでください。
- Argumentのindexで何を思ったか1スタートにしたら例外吐いてて例外読んでもぱっと見では原因に紐付かなくてはまった。
- org.kohsuke.args4j.spi.FieldSetter#getValue()を見るとフィールドアクセスできなかった時、setAccessibleで再アクセスを試みているので、セキュリティマネージャとか使ってると落ちるんじゃないだろうか・・・?