adamreeveによって提供された回答は本当に素晴らしいものであり、私はそれを受け入れますが、デフォルトのパーサー機能を拡張して、「-」または「--」記号がなくても無効なオプションを入力できないようにすることにしました。独自のカスタム パーサーを作成しました。
public class StrictParser extends Parser {
@Override
protected String[] flatten(Options opts, String[] arguments, boolean stopAtNonOption) {
return arguments;
}
@Override
public CommandLine parse(Options options, String[] arguments, boolean stopAtNonOption) throws ParseException {
CommandLine cmd = null;
List<String> tokenList = Arrays.asList(flatten(getOptions(), arguments, stopAtNonOption));
ListIterator<String> iterator = tokenList.listIterator();
boolean eatTheRest = false;
setOptions(options);
cmd = super.parse(options, arguments, stopAtNonOption);
while (iterator.hasNext()) {
String token = (String) iterator.next();
if (!token.startsWith("--") && !token.startsWith("-")) {
if (stopAtNonOption) {
throw new UnrecognizedOptionException("Unrecognized option: " + token +". Every option must start with '--' or '-'", token);
}
} else {
eatTheRest = true;
}
if (eatTheRest) {
iterator.next();
}
}
return cmd;
}
}
このソリューションでは、'--' または '-' なしで入力された cli パラメーターは UnrecognizedOptionException をスローします。これは完璧な解決策ではありませんが、それを行う方法を示しており、他の解決策への良い出発点になる可能性があります。たとえば、'--' と '-' のないオプションを受け入れることができますが、そのオプションが正しいかどうかを確認します。次に、変更する必要があります
if (stopAtNonOption) {
throw new UnrecognizedOptionException("Unrecognized option: " + token +". Every option must start with '--' or '-'", token);
}
に
if (stopAtNonOption) {
if(!getOptions().hasOption(token)){
throw new UnrecognizedOptionException(
"Unrecognized option: " + token, token);
}
}
(この醜い 3 つの入れ子になった if は無視してください;)) これもオプションごとに 1 つの引数しか受け入れませんが、前述したように、デフォルトのパーサーに他の変更を実装するための出発点にすぎません。