3

我将 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 也是必需的?

非常感谢

4

2 回答 2

1

编辑:我没有意识到您的意思是使目标(不是选项)成为必需的。

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

您可以稍后通过getArgs()返回 String[]的方法检索它们

然后,您可以检查这些字符串以确保有一个名为 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 提供了一种干净的方法来做到这一点。

于 2013-08-20T20:14:02.010 回答
1

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

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 我不知道任何其他方式

于 2013-08-20T21:02:24.580 回答