S-JIS[2022-09-07/2022-09-14] 変更履歴

JCommander JCommanderクラス

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();
commander.parse(args);
ビルダーで解析も行う方法 JCommander.newBuilder().addObject(argument).args(args).build();
コンストラクターを使う方法 JCommander commander = new JCommander(argument);
commander.parse(args);
コンストラクターで解析も行う方法
(非推奨)
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);

JCommander目次へ戻る / Javaへ戻る / 技術メモへ戻る
メールの送信先:ひしだま