Args4jを使ってコマンドライン引数を処理する

Javaコマンドライン引数を処理したいなー、でもApache Commons CLIは煩雑だよなー、などと思いながら他のライブラリを探していたら、Args4jという簡単に使える素敵ライブラリを見つけた。Annotationを使ってすっきり書ける。

Args4jのバイナリはなんか公式ページで配布されていなかったので、mavenリポジトリの方から取ってきた。

ということでShellっぽいサンプルプログラムを。完全に使い方を把握してる訳じゃないけど、Args4jが提供してるクラスは大して数も多くないし、いざとなったときに調べたらすぐにわかりそうな感じ。

import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;
import org.kohsuke.args4j.spi.StringArrayOptionHandler;

public class Shell {
    @Option(name="-v", aliases="--version", usage="print version")
    private boolean versionFlag;

    @Option(name="-h", aliases="--help", usage="print usage message and exit")
    private boolean usageFlag;

    @Argument(index=0, metaVar="script")
    private String script;

    @Argument(index=1, metaVar="arguments...", handler=StringArrayOptionHandler.class)
    private String[] arguments;

    public static void main(String[] args) {
        Shell shell = new Shell();

        CmdLineParser parser = new CmdLineParser(shell);
        try {
            parser.parseArgument(args);
        } catch (CmdLineException e) {
            e.printStackTrace();
            return;
        }

        if (shell.usageFlag) {
            System.out.println("Usage:");
            System.out.println(" Shell [options]");
            System.out.println(" Shell [options] script [arguments]");
            System.out.println();
            System.out.println("Options:");
            parser.printUsage(System.out);
            return;
        }
        
        if (shell.versionFlag) {
            System.out.print("Sample Program ver 1.0.0");
            return;
        }

        // do something...
    }
}

-h(--help)をつけて起動するとこんな感じで出力される。

Usage:
 Shell [options]
 Shell [options] script [arguments]

Options:
 -h (--help)    : print usage message and exit
 -v (--version) : print version

補足

  • @Optionでrequired=trueってやると、必須パラメータを設定することもできる。
  • org.kohsuke.args4j.spiパッケージにはStringArrayOptionHandlerの他にもEnumOptionHandlerとかFileOptionHandlerとか入ってるので、ごにょごにょできそう。