Apache Commons CLI 1.3.1:在具有多个参数的另一个选项之后的选项被用作 ARGUMENT
Apache Commons CLI 1.3.1: Option coming after another option with multiple arguments is consumed as ARGUMENT
我正在使用 Apache Commons CLI 1.3.1 来处理一些选项,并且一些选项可以接受一个到无限数量的参数。有两个选项的琐事示例是这样的
usage: myProgram -optionX <arg1> <arg2> <arg3> < ... > [-optionY]
-optionX <arg1> <arg2> <arg3> < ... > optionX takes one to unlimited
number of arguments.
-optionY optionY is optional
我发现第二个选项 optionY
总是被识别为 optionX
的 ARGUMENT 而不是被识别为 OPTION 本身。这意味着如果你输入
myProgram -optionX arg1 arg2 -optionY
在命令行中,您将获得与 optionX
.
关联的三个参数(arg1
、arg2
和 -optionY
)
这是任何人都可以用来重现问题的代码。
import org.apache.commons.cli.*;
public class TestCli {
public static void main(String[] args) {
Option optObj1 = Option.builder("optionX")
.argName("arg1> <arg2> <arg3> < ... ")
.desc("optionX takes one to unlimited number of arguments.")
.required()
.hasArgs()
.build();
Option optObj2 = new Option("optionY", "optionY is optional");
Options optsList = new Options();
optsList.addOption(optObj1);
optsList.addOption(optObj2);
CommandLineParser commandLineParser = new DefaultParser();
try {
CommandLine cmd = commandLineParser.parse(optsList, new String[]{"-optionX", "arg1", "arg2", "-optionY"});
System.out.println("--------------------------");
System.out.println("argument list of optionX: ");
for (String argName : cmd.getOptionValues(optObj1.getOpt())) {
System.out.println("arg: " + argName);
}
System.out.println("--------------------------");
System.out.println("value of optionY: " + cmd.hasOption(optObj2.getOpt()));
} catch (ParseException e) {
System.out.println("Unexcepted option: " + e.getMessage());
}
}
}
这是您将看到的输出。
--------------------------
argument list of optionX:
arg: arg1
arg: arg2
arg: -optionY
--------------------------
value of optionY: false
我是不是漏掉了什么?
任何建议将不胜感激。
问题是您将长名称放在选项的短名称中。
当您使用 Option optObj1 = Option.builder("optionX")....
或 new Option("optionY", "optionY is optional")
时,您设置的是选项的简称,它应该只有 1 个字符长。
在你有一个多参数选项之前,这很有效。在这种情况下,解析器无法在他的短选项列表中找到 "o"(您的选项的第一个字母)并且您没有设置长名称,因此解析器确定 -optionY 只是 - 的另一个参数选项X.
要解决您的问题,只需设置选项的长选项名称即可。
例子
Option.builder("x").longOpt("optionX")....
Option optObj2 = new Option("y", "optionY", hasArgs, "optionY is optional");
我正在使用 Apache Commons CLI 1.3.1 来处理一些选项,并且一些选项可以接受一个到无限数量的参数。有两个选项的琐事示例是这样的
usage: myProgram -optionX <arg1> <arg2> <arg3> < ... > [-optionY]
-optionX <arg1> <arg2> <arg3> < ... > optionX takes one to unlimited
number of arguments.
-optionY optionY is optional
我发现第二个选项 optionY
总是被识别为 optionX
的 ARGUMENT 而不是被识别为 OPTION 本身。这意味着如果你输入
myProgram -optionX arg1 arg2 -optionY
在命令行中,您将获得与 optionX
.
arg1
、arg2
和 -optionY
)
这是任何人都可以用来重现问题的代码。
import org.apache.commons.cli.*;
public class TestCli {
public static void main(String[] args) {
Option optObj1 = Option.builder("optionX")
.argName("arg1> <arg2> <arg3> < ... ")
.desc("optionX takes one to unlimited number of arguments.")
.required()
.hasArgs()
.build();
Option optObj2 = new Option("optionY", "optionY is optional");
Options optsList = new Options();
optsList.addOption(optObj1);
optsList.addOption(optObj2);
CommandLineParser commandLineParser = new DefaultParser();
try {
CommandLine cmd = commandLineParser.parse(optsList, new String[]{"-optionX", "arg1", "arg2", "-optionY"});
System.out.println("--------------------------");
System.out.println("argument list of optionX: ");
for (String argName : cmd.getOptionValues(optObj1.getOpt())) {
System.out.println("arg: " + argName);
}
System.out.println("--------------------------");
System.out.println("value of optionY: " + cmd.hasOption(optObj2.getOpt()));
} catch (ParseException e) {
System.out.println("Unexcepted option: " + e.getMessage());
}
}
}
这是您将看到的输出。
--------------------------
argument list of optionX:
arg: arg1
arg: arg2
arg: -optionY
--------------------------
value of optionY: false
我是不是漏掉了什么?
任何建议将不胜感激。
问题是您将长名称放在选项的短名称中。
当您使用 Option optObj1 = Option.builder("optionX")....
或 new Option("optionY", "optionY is optional")
时,您设置的是选项的简称,它应该只有 1 个字符长。
在你有一个多参数选项之前,这很有效。在这种情况下,解析器无法在他的短选项列表中找到 "o"(您的选项的第一个字母)并且您没有设置长名称,因此解析器确定 -optionY 只是 - 的另一个参数选项X.
要解决您的问题,只需设置选项的长选项名称即可。
例子
Option.builder("x").longOpt("optionX")....
Option optObj2 = new Option("y", "optionY", hasArgs, "optionY is optional");