我即将迁移某些遗留代码含有较少的过时的警告,第三次三方库.对于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"
提示:我使用的调试器通过检查字段来验证解析过程的不正确的结果values
在org.apache.commons.cli.Option
通过返回的commands
变量.
我的期望是,解析器的内部变化应该不会产生不同的结果,因为这打破现有的代码.切换到DefaultParser
多个选项值和自定义分隔符时,有没有人遇到过与Apache Commons-CLI相同的行为?
DefaultParser
我可能会监督的建筑/用途有什么不同吗?
单步执行代码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
没有得到认可似乎是一个错误给我.