虽然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);
}
}
(忽略这个丑陋的三个嵌套IFS;)) 这也接受每个选项只有一个参数,但正如我已经提到它只有起点实施对默认分析器的其他修改
好吧,我理解这一点,但我认为在commons-cli库中我将能够验证所有命令行参数 –
可悲的是,正如我所知:(这就是为什么你可以经常告诉什么时候使用commons-cli的原因 - 因为一切都是'--'选项:) – adamreeve