Apache Commons CLI:如何防止使用选项的短名称?

11
在Apache Commons CLI库中,是否可以绕过短名称的使用,从而强制用户使用长名称?通常情况下,选项是这样定义的:
new Option("u", "username", true, "automatic user name")

我希望禁止使用字母"u"。但如果我用null或空字符串来替换它,就会出现异常...

为什么要这样要求呢?因为我的应用程序中的某些部分是Spring Boot,Spring Boot默认识别此格式的选项:--optionName=optionValue。

此外,为了在开发人员和用户之间保持一致,并简化文档,我认为我们最好只有一种使用选项的方法。

1个回答

10

当我使用最新版本的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);

是的,你的代码很好用,我感谢你。事实上,我想获取一个选项的值。例如,假设声明帮助可以接收一个值,如下所示:new Option(null,“help”,false,“一些描述”); 那么我该如何访问命令行给“help”赋的值?我觉得所有的API方法都需要使用短参数来查询值... - Francois Marot
你尝试将Option的“hasArgs”参数设置为“true”,然后通过cmd.getOptionValue(“help”)查询它了吗?通常在发布后续问题之前,请先阅读一下JavaDoc,这些问题应该很容易找到答案。请尽快点赞并接受答案,如果它回答了你最初的问题。 - centic
谢谢Centric,你是对的。我被文档误导了,有时候把'longopt'或者'name'称为同一件事...下面是一个单元测试(或者也许你可以用这个更适合我的原始问题来编辑你的答案)。非常感谢! - Francois Marot
@Test public void testOnlyLongOpt() throws ParseException { Options options = new Options(); Option option = new Option(null, "help", true, "一些描述"); // 选项的短名称为null => 只能使用长名称查询 options.addOption(option); CommandLineParser parser = new DefaultParser(); CommandLine cmd = parser.parse( options, new String[] {"--help=foobar"}); assertEquals(cmd.hasOption("help"), true); String optionValue = cmd.getOptionValue("foobar"); assertEquals(optionValue, "coucou"); } - Francois Marot
我认为在 apache-cli <= 1.2 中这是不可能的。 - Andrea Bergonzo
显示剩余2条评论

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