如何确保在Apache Commons CLI中提供了所有参数?

7

我没有看到一个标准的方法来检查是否提供了String[]输入中所有选项,以apache的CLI库为例。也就是说,我的选项在命令行都是必填的,否则,我希望抛出一个异常。

我正在尝试以下方法作为解决方法,但在if语句中得到一个空指针异常...

PosixParser p = new PosixParser();
        CommandLine cli=p.parse(options,args);
        for(Object o : options.getOptions())
        {
            Option op = (Option)o;
            if(cli.getOptionValue(op.getName()))
            throw new ParseException("Missing argument ! " + op.getArgName() + ":"+op.getDescription());
    }

关于此更新:getOpt()方法似乎提供了参数的短名称。

不过,如果我将op.getName()替换为opt.getLongName()……它就可以工作了!

无论如何,我有两个问题:

1)为什么一个选项会有空名称,但非空的长名称?
2)是否有一种简单的方法来确保所有选项都提供了String[]?例如,我想调用:

  if(! options.isAllProvided())
     throw new ParseException("You are missing some options ! " + StringUtils.join(userInputArray,','));

刚刚注意到:为了通过其短名称获取选项,您需要调用getOpt()方法,而不是getArgName()或任何其他方法。 - jayunit100
1个回答

10

以下是如何将选项设置为必填的方法:

Option logfile = OptionBuilder.withArgName( "file" )
            .isRequired() // make it required
            .hasArg()
            .withDescription(  "use given file for log" )
            .create( "logfile" );

(我认为没有简单的方法可以一步完成所有选项的必填)


1
哦,太糟糕了。看起来这个API需要复活。 - jayunit100
你确实需要将选项标记为必填。如果有一些选项缺失,那么你会得到一个异常,其中包含缺失选项的列表。 - Emmanuel Bourg
确实有些啰嗦且不太美观,但我发现创建一个工厂类并编写像 makeRequiredOption 这样的方法可以极大地提高主类的可读性。 - bcoughlan
2
OptionBuilder现在已经被弃用,请使用Option.builder("file")代替。 - cahen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接