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);