我即将将一些陈旧的代码迁移,以减少第三方库中过时警告。在Apache commons-cli
库(版本:1.3.1)中,我在官方JavaDoc中发现GnuParser
已被弃用,应使用DefaultParser
代替:
@deprecated since 1.3, use the
{@link DefaultParser}
instead
但是,以下代码片段的预期行为停止正常工作:
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(',')
来定义自定义分隔符,
以使CLI支持多个gst类型(请参见代码片段)。
以下程序参数用作调用CLI的输入:
java -jar MyCLI.jar -gst category -gsd 4
显然,在gsd参数之后还可以添加其他几个参数。对于“gst”参数的无分隔符使用,预期且正确解析的选项为(通过GnuParser
):
- "category"(仅此而已)
然而,当我更改我的代码并转向建议使用的解析器时:
CommandLineParser parser = new DefaultParser();
解析出的值被错误地检测为:
- "category"
- "-gsd"
- "4"
提示:我使用调试器通过检查返回的commands
变量中的org.apache.commons.cli.Option
中的values
字段来验证解析过程的不正确结果。
我的期望是解析器的内部更改不应产生不同的结果,因为这会破坏现有的代码。是否有人在切换到DefaultParser
和几个选项值和自定义分隔符时遇到过Apache Commons-CLI相同的行为?
我可能忽略了DefaultParser
的构建/使用上的差异吗?
GnuParser
负责时它能够正常工作:gst和gsd都被检测到了,符合我的预期。 - MWiesner