当前位置:  开发笔记 > 编程语言 > 正文

使用DefaultParser而不是GnuParser时,为什么检测到的CLI选项不同?

如何解决《使用DefaultParser而不是GnuParser时,为什么检测到的CLI选项不同?》经验,为你挑选了1个好方法。

我即将迁移某些遗留代码含有较少的过时的警告,第三次三方库.对于Apache commons-cli库(版本:1.3.1),我在官方JavaDoc中检测到GnuParser已弃用,DefaultParser应该使用:

@deprecated自1.3以来,使用{@link DefaultParser}而不是

但是,以下代码段停止按预期方式工作:

Options options = new Options();    
Option optionGSTypes = new Option(
        "gst","gs-types", true,
        "the supported types, comma-separated: article, category, template, all");
optionGSTypes.setArgs(3);
optionGSTypes.setValueSeparator(',');
options.addOption(optionGSTypes);

// ... other options

// parsed option values are correct, yet this is deprecated
CommandLineParser parser = new GnuParser(); 
CommandLine commands = parser.parse(options, args);

// ... interpret parsed 'commands' and related actual values via CLI

请注意,setValueSeparator(',')此处用于定义自定义分隔符char ,以使CLI能够支持sevaral gst -types(请参阅代码段).

作为输入,以下程序参数用于调用CLI:

java -jar MyCLI.jar -gst category -gsd 4

显然,在gsd参数之后也可能添加了其他几个参数.无分隔符使用"gst"参数的预期和正确解析选项是(via GnuParser):

    "类别"(没有别的)

但是,当我更改我的代码并通过以下方式切换到推荐的解析器时:

CommandLineParser parser = new DefaultParser();

生成的,已解析的值被错误地检测为:

    "类别"

    "-gsd"

    "4"

提示:我使用的调试器通过检查字段来验证解析过程的不正确的结果valuesorg.apache.commons.cli.Option通过返回的commands变量.

我的期望是,解析器的内部变化应该不会产生不同的结果,因为这打破现有的代码.切换到DefaultParser多个选项值和自定义分隔符时,有没有人遇到过与Apache Commons-CLI相同的行为?

DefaultParser我可能会监督的建筑/用途有什么不同吗?



1> Sven Schoenu..:

单步执行代码DefaultParser,这似乎是一个错误.

首先通过调用哪个返回来DefaultParser识别-gst为短选项.Options.hasShortOption("-gst")true

到现在为止还挺好.

现在,当决定是否将其解释-gsd为参数值时,-gst DefaultParser需要弄清楚if -gsd本身是否是一个选项(因此不能成为参数-gst).它通过调用它自己来实现isShortOption("-gsd").然而false,如果您查看代码,这会返回原因:

private boolean isShortOption(String token)
{
    // short options (-S, -SV, -S=V, -SV1=V2, -S1S2)
    return token.startsWith("-") && token.length() >= 2 && 
           options.hasShortOption(token.substring(1, 2));
}

这将从-gst选项中提取第一个字母,从而调用Options.hasShortOption("g")哪个返回false.该代码似乎是为POSIX风格的单字母选项设计的,但是对于你使用的多字母单连字符选项而言它会分解.

然而你转过来,-gst被认为是一个简短的选项,但-gsd 没有得到认可似乎是一个错误给我.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有