lei*_*ood 13 java apache-commons apache-commons-cli
我曾经使用过Apache Commons Cli 1.2.我希望解析器忽略参数,如果它们是未知的(不添加到Options-Object).
示例(伪代码):
Options specialOptions;
specialOptions.addOption(null, "help", false, "shows help");
specialOptions.addOption(null, "version", false, "show version");
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse(options, args); //no third argument, since i dont want the program to stop parsing.
// run program with args: --help --unknown --version
// program shall parse --help AND --version, but ignore --unknown
Run Code Online (Sandbox Code Playgroud)
我使用了PascalSchäfer的解决方案: Apache Commons CLI选项解析器可以忽略未知的命令行选项吗?
这对我来说在1.2上工作正常,它在1.3.1上也可以正常工作.但它被弃用了.我使用的解析器被替换为DefaultParser.我查看了功能,但没有这样的方法processOptions.
我真的想使用在以后的版本中不会被删除的代码.有谁知道如何解决这个问题?
谢谢@kjp 的建议;但解决方案不适用于带值的参数。
我尝试改进 kjp 的解决方案:
public class RelaxedParser extends DefaultParser {
@Override
public CommandLine parse(final Options options, final String[] arguments) throws ParseException {
final List<String> knownArgs = new ArrayList<>();
for (int i = 0; i < arguments.length; i++) {
if (options.hasOption(arguments[i])) {
knownArgs.add(arguments[i]);
if (i + 1 < arguments.length && options.getOption(arguments[i]).hasArg()) {
knownArgs.add(arguments[i + 1]);
}
}
}
return super.parse(options, knownArgs.toArray(new String[0]));
}
Run Code Online (Sandbox Code Playgroud)
}
这应该适用于您的用例:
Options options = new Options();
CommandLine commandLine = new DefaultParser().parse(options, args, true);
Run Code Online (Sandbox Code Playgroud)
对您来说重要的部分是 stopAtNonOption: true:
指示如何处理无法识别的令牌的标志。true 停止解析并将剩余标记添加到 args 列表中。false 抛出异常。
| 归档时间: |
|
| 查看次数: |
3176 次 |
| 最近记录: |