Apache Common CLI:如何添加参数?

时间:2013-08-20 20:07:15

标签: java apache-commons

我正在使用Common CLI进行个人项目。我从文档中找不到的一件事是如何强制执行某个参数。

为了澄清我的问题,我可以定义参数和选项之间的不同,命令:

    mycommand file.txt -b 2

mycommand is the command, 
file.txt is the argument
-b 2 is the option where 2 is the option value

使用Common CLI,我可以添加-b 2作为这样的选项:

    options.addOption( "b", true, "Some message" );

使用以下方法解析参数:

CommandLineParser commandParser = new GnuParser();
CommandLine result = commandParser.parse(options, args)

但是如何指定file.txt也是必需的?

非常感谢

2 个答案:

答案 0 :(得分:1)

编辑:我没有意识到你的意思是要求制定目标(不是一个选项)。

如果使用完全解析方法CommandLineParser.parse(Options, String[], boolean)且可选标志设置为false,则解析器将跳过未知参数。

您可以稍后通过返回String []

的方法getArgs()检索它们

然后,您可以浏览这些字符串以确保有一个名为file.txt的字符串

Options options = new Options();

options.addOption("b", true, "some message");

String[] myArgs = new String[]{"-b","2", "file.txt"};
CommandLineParser commandParser = new GnuParser();

CommandLine commandline = commandParser.parse(options, myArgs, false);

System.out.println(Arrays.toString(commandline.getArgs()));

[file.txt]打印到屏幕上。

所以你添加一个额外的检查来搜索该数组以找到任何所需的目标:

boolean found=false;
for(String unparsedTargets : commandline.getArgs()){
    if("file.txt".equals(unparsedTargets)){
        found =true;
    }
}
if(!found){
    throw new IllegalArgumentException("must provide a file.txt");
}

我同意它很乱,但我不认为CLI提供了一种干净的方法来实现这一点。

答案 1 :(得分:1)

不可以使用当前的API,但我认为如果必须参数名称EVER file.txt,您可以使用自己的Parser.parse()实现扩展GnuParser。
否则,如果文件名可以更改,您可以覆盖Parser.processArgs()(对于非选项参数,您的文件名,我的意思)和Parser.processOption()(设置一个标志表示您找到了有效的选项):如果您输入在Parser.processArgs()中设置标志时,您发现了一个无效的未命名的arg)

public class MyGnuParser extends GnuParser {

    private int optionIndex;
    private String filename;

    public MyGnuParser() {
        this.optionIndex = 0;
        this.filename = null;
    }

public CommandLine parse(Options options, String[] arguments, Properties properties) throws ParseException {
       CommandLine cmdLine = super.parse(options, arguments, properties, false);
       if(this.filename == null) throw new ParseException(Missing mandatory filename argument);
    }

    @Override
    public void processArgs(Option opt, ListIterator iter) throws ParseException {
      super.processArgs(opt, item);
      ++this.optionIndex;
    }

    @Override
    protected void processOption(final String arg, final ListIterator iter) throws    ParseException {
      if(this.optionIndex > 0) {
        throw new ParseException(non-opt arg must be the first);
      }
      if(this.filename != null) {
        throw new ParseException(non-opt invalid argument);
      }
      this.filename = arg;
      ++this.optionIndex;
    }
}

MyGnuParser p = new MyGnuParser();
CommandLine cmdLine = p.parse(options, args, properties);

并在p.filename(或cmdLine.getArgs[0])中,您可以获取文件名。

它不直观,但使用CLI API我不知道其他任何方式