使用Apache Commons CLI检测命令行参数/选项的缺失

5
我目前正在使用库Apache Commons CLI 1.3.1来解析命令行参数并控制可执行jar包的执行流程。到目前为止,一切都很简单,文档示例用法页面相对详细和有帮助。
然而,我仍不清楚如何使用此库来检测任何参数或选项的缺失。我想检测这种情况,然后打印使用说明/帮助语句。我已经通过简单地检查参数数组的长度来解决了这个问题,但我想知道该库是否有一种方法可以在不检查每个选项是否存在的情况下检测此条件。
以下是我的代码,其中包含解决方法:
public static void main(String[] args)
{
    try
    {
       // create Options object
       Options options = new Options();

       // add t option
       options.addOption("t", false, "display current time");
       options.addOption("help", false, "print this message");

       CommandLineParser parser = new DefaultParser();
       CommandLine cmd = parser.parse(options, args);

       if(cmd.hasOption("t")) {
           log.debug("Received option t");
           // Do something
       }

       if (args.length <= 0 || cmd.hasOption("help"))
       {
           // automatically generate the help statement
           HelpFormatter formatter = new HelpFormatter();
           formatter.printHelp( "java -jar Client.jar <option> <arguments>", options);
       }
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
}
2个回答

3
我认为你正在寻找getArgListgetArgs方法。根据文档:

检索任何未识别的选项和参数

所以,不要使用以下代码:

   if (args.length <= 0 || cmd.hasOption("help"))

使用方法如下:

   if (cmd.getArgs().length == 0 || cmd.hasOption("help"))

很好。我误解了文档。我原以为这是提交给特定选项的参数列表。谢谢。顺便说一下,应该是 cmd.getArgs().length - Iofacture
但值得注意的是,如果你的程序期望不带参数的开关,则这种方法无效。例如,如果我使用该方法,则即使命令是“client.jar -t”,帮助也会被打印出来。 - Iofacture
1
嗨,感谢您的更正!如果您的程序不应该有多余的参数,那么当然您应该改变条件,并在这种情况下引发错误。 - janos

2
请注意,cmd.getArgs().length不计算命令行上的开关(-xxxx) - 只计算不以破折号开头的参数。

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