Help us understand the problem. What is going on with this article?

初めてのargs4j

More than 1 year has passed since last update.

args4jとは

コマンドライン引数の解釈をしてくれるライブラリです。
http://args4j.kohsuke.org/

ex) java example.class hoge fuga -foo bar
class以降の文字列がコマンドライン引数

前提

執筆時点最新のver2.33を使います。

使い方

使うこと自体はいたって簡単3ステップ
1. 読込先 兼 定義のクラスを用意
1. パーサーのインスタンスを生成
1. メソッド起動
以上
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扱いされてしまうことを避けるため

sample
@Option(name="hoge")
public Boolean flag;

次の起動でflagがtrueになる

コマンド
java example hoge

Argument

名前なし引数に対して使用するアノテーション

index

何番目に出現するかを指定する。配列と同じく0スタート
デフォルトが0指定されているため省略可能

sample
@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で再アクセスを試みているので、セキュリティマネージャとか使ってると落ちるんじゃないだろうか・・・?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした