如何在Apache Commons CLI中解析未定义的未知选项?
Apache Commons CLI 处理未定义的未知选项
当然可以处理未在Options中定义的未知选项,不过默认解析器会直接抛出ParseException,需要调整解析器配置来开启未知选项支持,具体步骤如下:
1. 开启未知选项允许模式
使用DefaultParser时,调用setAllowUnrecognizedOptions(true)方法,让解析器忽略未定义选项的报错,转而收集这些未知内容:
DefaultParser parser = new DefaultParser(); parser.setAllowUnrecognizedOptions(true);
2. 获取并处理未知选项
解析完成后,通过CommandLine对象的getUnrecognizedOptions()方法,可以获取所有未被识别的选项及其参数(返回List<String>类型)。比如你提到的--unknownArgument foo,会被收集为["--unknownArgument", "foo"]。
完整示例代码
import org.apache.commons.cli.*; import java.util.List; public class UnknownOptionDemo { public static void main(String[] args) throws ParseException { // 定义已知选项 Options options = new Options(); options.addOption("greeting", true, "display greeting"); // 配置解析器允许未知选项 DefaultParser parser = new DefaultParser(); parser.setAllowUnrecognizedOptions(true); CommandLine cmd = parser.parse(options, args); // 处理已知选项 if (cmd.hasOption("greeting")) { System.out.println("已识别问候语:" + cmd.getOptionValue("greeting")); } // 处理未知选项,可传递给下游流程 List<String> unknownOpts = cmd.getUnrecognizedOptions(); if (!unknownOpts.isEmpty()) { System.out.println("检测到未知选项及参数:"); unknownOpts.forEach(opt -> System.out.println(" " + opt)); // 此处可将unknownOpts直接传递给下游逻辑,比如转成数组或直接传入方法 } } }
运行时传入参数--greeting hello --unknownArgument foo,会输出:
已识别问候语:hello 检测到未知选项及参数: --unknownArgument foo
版本注意事项
如果使用Apache Commons CLI 1.3及更早版本,CommandLine没有getUnrecognizedOptions()方法,此时未知选项会被放入getArgs()返回的列表中,处理逻辑需要自行区分选项和普通参数。
内容的提问来源于stack exchange,提问作者J-T
相关产品推荐
相关产品推荐

