Examples

CJK line-wrap example

Sub-set of options of ls(1). The help messages are from Debian Linux:

import static net.sourceforge.argparse4j.impl.Arguments.storeTrue;
import net.sourceforge.argparse4j.ArgumentParsers;
import net.sourceforge.argparse4j.inf.ArgumentParser;
import net.sourceforge.argparse4j.inf.ArgumentParserException;
import net.sourceforge.argparse4j.inf.Namespace;

public class LsHelpDemo {

    public static void main(String[] args) {
        ArgumentParser parser = ArgumentParsers
                .newArgumentParser("ls")
                .defaultHelp(true)
                .description(
                        "FILE に関する情報を一覧表示します (デフォルトは現在のディレクトリ)。\n"
                                + "-cftuvSUX または --sort が指定されない限り、要素はアルファベット順で並べ替えられます。")
                .epilog("SIZE は次のうちの一つです (整数の後に付加されるかもしれません):\n"
                        + "KB 1000, K 1024, MB 1000*1000, M 1024*1024, その他 G, T, P, E, Z, Y など。");
        parser.addArgument("-a", "--all").help(". で始まる要素を無視しない")
                .action(storeTrue());
        parser.addArgument("-A", "--almost-all").help(". および .. を一覧表示しない")
                .action(storeTrue());
        parser.addArgument("--author").help("-l と合わせて使用した時、各ファイルの作成者を表示する")
                .action(storeTrue());
        parser.addArgument("-b", "--escape")
                .help("表示不可能な文字の場合に C 形式のエスケープ文字を表示する").action(storeTrue());
        parser.addArgument("--block-size")
                .type(Integer.class)
                .metavar("SIZE")
                .help("SIZE の倍数として表示する。例: `--block-size=M' は"
                        + "表示する時に 1,048,576 バイトの倍数としてサイズを"
                        + "表示する。SIZE の形式は以下を参照)");
        parser.addArgument("-B", "--ignore-backups").help("~ で終了する要素を一覧表示しない")
                .action(storeTrue());
        parser.addArgument("-c")
                .help("-lt と使用した場合: ctime (ファイル状態情報を変更した時間)で並べ替えて表示する\n"
                        + "-l と使用した場合: 名前で並べ替えて ctime を表示する\n"
                        + "それ以外: ctime で新しい順に並べ替える)").action(storeTrue());
        parser.addArgument("-C").help("要素を列ごとに並べる").action(storeTrue());
        parser.addArgument("--color")
                .nargs("?")
                .choices("always", "never", "auto")
                .metavar("WHEN")
                .setDefault("always")
                .help("カラー出力をする。 WHEN のデフォルト値は `always'、"
                        + "`never' または `auto'。詳細は下部を参照)");
        parser.addArgument("file").nargs("*");
        Namespace res;
        try {
            res = parser.parseArgs(args);
            System.out.println(res);
        } catch (ArgumentParserException e) {
            parser.handleError(e);
            System.exit(1);
        }
    }
}
$ java LsHelpDemo -h
usage: ls [-h] [-a] [-A] [--author] [-b] [--block-size SIZE] [-B] [-c] [-C]
          [--color [WHEN]] [file [file ...]]

FILE に関する情報を一覧表示します (デフォルトは現在のディレクトリ)。
-cftuvSUX または  --sort が指定されない限り、要素はアルファベット順で並べ替
えられます。

positional arguments:
  file

optional arguments:
  -h, --help             show this help message and exit
  -a, --all              . で始まる要素を無視しない (default: false)
  -A, --almost-all       . および .. を一覧表示しない (default: false)
  --author               -l  と合わせて使用した時、各ファイルの作成者を表示
                         する (default: false)
  -b, --escape           表示不可能な文字の場合に C  形式のエスケープ文字を
                         表示する (default: false)
  --block-size SIZE      SIZE の倍数として表示する。例: `--block-size=M' は
                         表示する時に 1,048,576  バイトの倍数としてサイズを
                         表示する。SIZE の形式は以下を参照)
  -B, --ignore-backups   ~ で終了する要素を一覧表示しない (default: false)
  -c                     -lt と使用した場合:  ctime (ファイル状態情報を変更
                         した時間)で並べ替えて表示する
                         -l と使用した場合: 名前で並べ替えて ctime を表示す

                         それ以外: ctime  で新しい順に並べ替える) (default:
                         false)
  -C                     要素を列ごとに並べる (default: false)
  --color [WHEN]         カラー出力をする。      WHEN      のデフォルト値は
                         `always'、`never'  または   `auto'。詳細は下部を参
                         照) (default: always)

SIZE は次のうちの一つです (整数の後に付加されるかもしれません):
KB 1000, K 1024, MB 1000*1000, M 1024*1024, その他 G, T, P, E, Z, Y など。

Clojure example

(ns argparse4j-demo
    (:import (net.sourceforge.argparse4j ArgumentParsers)
             (net.sourceforge.argparse4j.impl Arguments)
             (net.sourceforge.argparse4j.inf ArgumentParserException)))

;; Helper function to convert closure list to array
(defn va [& name-and-flags]
  (into-array name-and-flags))

(def ap (. ArgumentParsers newArgumentParser
           "java -cp clojure.jar clojure.main"))

(let [group (. ap addArgumentGroup "init options")]
     (doto (. group addArgument (va "-i" "--init"))
           (.metavar (va "path"))
           (.help "Load a file or resource"))
     (doto (. group addArgument (va "-e" "--eval"))
           (.metavar (va "string"))
           (.help "Evaluate expressions in string; print non-nil values")))

(let [group (. ap addArgumentGroup "main options")]
     (doto (. group addArgument (va "-m" "--main"))
           (.metavar (va "ns-name"))
           (.help "Call the -main function from a namespace with args"))
     (doto (. group addArgument (va "-r" "--repl"))
           (.action (. Arguments storeTrue))
           (.help "Run a repl"))
     (doto (. group addArgument (va "path"))
           (.help (str "Run a script from from a file or resource;"
                       " use '-' to read from standard input"))))

(try
 (println (. ap parseArgs (into-array String *command-line-args*)))
 (catch RuntimeException e
        (if (instance? ArgumentParserException (. e getCause))
            (. ap handleError (. e getCause))
          (. e printStackTrace))
        (. System exit 1)))

With Closure, use Long type instead of Integer if you use Argument.choices() with integer constants:

(def ap (. ArgumentParsers newArgumentParser "hello"))
(doto (. ap addArgument (va "-i"))
      (.type Long)
      (.choices [1 2 3])
      (.action (. Arguments append)))