我正在使用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也是必需的?
非常感谢
答案 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我不知道其他任何方式