JCommanderのJCommanderクラスのメモ。
| 
 | 
 | 
JCommanderでコマンドラインパラメーターの解析を行うのがJCommanderクラス。
使用方法(パラメーターの種類)を表示するメソッドもある。
JCommanderのインスタンス生成方法は、JCommanderの公式サイトではビルダーを使っているが、何通りかの方法がある。
package com.example.jcommander; import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter;
public class JCommanderExample {
    static class Argument {
        @Parameter(names = { "-n", "--name" }, description = "user name")
        String name;
    }
public static void main(String... args) { var argument = new Argument(); JCommander commander = JCommander.newBuilder() .addObject(argument) .build(); commander.parse(args); System.out.printf("name=%s%n", argument.name); } }
| ビルダーで生成して解析する方法 | JCommander commander = JCommander.newBuilder().addObject(argument).build(); | 
| ビルダーで解析も行う方法 | JCommander.newBuilder().addObject(argument).args(args).build(); | 
| コンストラクターを使う方法 | JCommander commander = new JCommander(argument); | 
| コンストラクターで解析も行う方法 (非推奨) | new JCommander(argument, args); | 
(parseでなく)parseWithoutValidationメソッドを使うと、バリデーション(必須チェック等)は実行されない。
定義されていないパラメーターが指定された場合(かつ、名前の無いパラメーターが無い場合)、ParameterExceptionが発生する。
(acceptUnknownOptionsをtrueにすると、発生しなくなる)
import com.beust.jcommander.ParameterException;
    try {
        commander.parse(args);
    } catch (ParameterException e) {
        System.err.println(e.getMessage());
        // 使用方法を表示
        e.usage();
//      commander.usage();
        System.exit(1);
    }
Was passed main parameter '--zzz' but no main parameter was defined in your arg class
Usage: <main class> [options]
  Options:
    -n, --name
      user name
JCommander.Builderには色々な設定値がある。
| Builderのメソッド | JCommanderのメソッド | 説明 | 
|---|---|---|
| .programName("name") | commander.setProgramName("name"); | プログラム名を設定する。 この名前はusage()で表示される。 | 
| .acceptUnknownOptions(true) | commander.setAcceptUnknownOptions(true); | trueにすると、定義されていないパラメーターが指定されてもエラーにしない。 デフォルトはfalse。 (未定義のパラメーターは、名前の無いパラメーターがある場合は、そこに値として追加される) | 
JCommanderのusageメソッドで、使用方法(パラメーターの種類)が(標準出力に)表示される。
commander.usage();
Usage: <main class> [options]
  Options:
    -n, --name
      user name
| コーディング例 | 実行例 | |
|---|---|---|
| プログラム名を指定する例 | JCommander.newBuilder()
    .programName("appName")
    .addObject(argument)
    .build();var commander = new JCommander(argument);
commander.setProgramName("appName"); | Usage: appName [options]
  Options:
    -n, --name
      user name | 
| パラメーターにデフォルト値がある例 | @Parameter(names = { "-n", "--name" }, 〜)
String name = "zzz"; | Usage: <main class> [options]
  Options:
    -n, --name
      user name
      Default: zzz | 
| 必須パラメーターの例 | @Parameter(〜, required = true) String name; | Usage: <main class> [options]
  Options:
  * -n, --name
      user name | 
| 名前の無いパラメーターがある例 | class Argument {
    〜
    @Parameter(description = "<main1> <main2>")
    List<String> mainParameterList;
} | Usage: <main class> [options] <main1> <main2>
  Options:
    -n, --name
      user name | 
複数のパラメーターがある場合、デフォルトでは、パラメーターのアルファベット順に並べられるっぽい。[2022-09-14]
並び順を指定したい場合は@Parameterのorderを指定する。
usageメソッドは使用方法を標準出力に出力するが、内部で使用しているフォーマッターを直接使えば、使用方法を文字列として取得できる。
import com.beust.jcommander.IUsageFormatter;
    IUsageFormatter formatter = commander.getUsageFormatter();
    var sb = new StringBuilder();
    formatter.usage(sb); // sbに使用方法を出力
    System.err.println(sb);