我曾经使用过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
我使用了Pascal Schäfer的解决方案:Can Apache Commons CLI options parser ignore unknown command-line options?
这在我的1.2上运行得很好,在1.3.1上也运行得很好。但它已被弃用。我使用的解析器被DefaultParser
所取代。我查找了功能,但没有这样的方法processOptions
。
我真的很想使用在以后的版本中不会被删除的代码。有谁知道如何解决这个问题吗?
发布于 2020-04-21 05:09:16
谢谢您的建议,@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]));
}
}
发布于 2018-06-02 09:15:18
这里可以使用Pascal在解决方案中给出的相同方法。
public class RelaxedParser extends DefaultParser {
@Override
public CommandLine parse(Options options, String[] arguments) throws ParseException {
List<String> knownArguments = new ArrayList<>();
for (String arg : arguments) {
if (options.hasOption(arg)) {
knownArguments.add(arg);
}
}
return super.parse(options, knownArguments.toArray(new String[knownArguments.size()]));
}
}
或者,也可以如上所述从args中删除未知选项,并使用DefaultParser。
https://stackoverflow.com/questions/33874902
复制相似问题