【问题标题】:Apache Commons CLI: how to prevent using short-name for options?Apache Commons CLI:如何防止对选项使用短名称?
【发布时间】:2016-11-23 13:37:31
【问题描述】:

在 Apache Commons CLI lib 中,是否可以绕过短名称的使用,从而强制用户使用长名称?

通常,选项是这样定义的:

new Option("u", "username", true, "automatic user name")

我想禁止使用“u”。但是如果我用null或者空字符串替换它,就会出现异常...

为什么有这个要求?我希望我的所有选项都只采用 --optionName=optionValue 的形式,因为我的应用程序的某些部分是 Spring Boot 并且 Spring Boot 默认识别这种格式的选项。

此外,为了开发人员和用户之间的一致性以及简化文档,我发现如果我们有一种独特的方式来使用选项而不是 2 会更好。

【问题讨论】:

    标签: java command-line-interface apache-commons apache-commons-cli


    【解决方案1】:

    在使用最新版本的 Apache Commons Cli 1.3.1 和 DefaultParser(这是目前唯一未弃用的)时,将 null 作为简称传入对我有用:

        Options options = new Options();
    
        Option option = new Option(null, "help", true, "some desc");
    
        options.addOption(option);
    
        CommandLineParser parser = new DefaultParser();
        CommandLine cmd = parser.parse( options, new String[] {"--help=foobar"});
    
        // automatically generate the help statement
        HelpFormatter formatter = new HelpFormatter();
        formatter.printHelp( "ant", options );
    
        assertEquals(cmd.hasOption("help"), true); 
        String optionValue = cmd.getOptionValue("help"); 
        assertEquals("foobar", optionValue);
    

    【讨论】:

    • 感谢@centric 的回答,但我可能很笨,我不明白在空短参数的情况下如何查询“cmd”对象。似乎 CommandLine 类上的所有方法都需要一个短名称作为参数传递......你能帮我吗?谢谢!
    • 我的代码使用cmd.hasOption("help") 来检查是否给出了--help,这对你也有用吗?
    • 是的,您的代码运行良好,对此我表示感谢。事实上我想得到一个选项的价值。例如,假设如果这样声明,帮助可能会收到一个值: new Option(null, "help", false, "some desc");那么我将如何访问命令行上给出的值来“帮助”?我觉得所有 API 的方法都需要使用短参数来查询值...
    • 您是否尝试将 Option 的“hasArgs”参数设置为“true”,然后通过cmd.getOptionValue("help") 进行查询?一般来说,在发布应该很容易找到的后续问题之前,请先阅读 JavaDoc。请在回答您的原始问题后立即投票并接受答案。
    • 感谢 Centric,您是对的。我被有时称为“longopt”或“name”相同事物的文档误导了......这是下面的单元测试(或者您可以使用这个单元测试来编辑您的答案,它甚至最适合我的原始问题)。谢谢大家!
    猜你喜欢
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多