java - Apache命令行解析器错误?
问题描述
我从教程点的示例代码中获得了下面的代码,并对其进行了一些调整。
应用程序.java
public static void main(String[] args) throws ParseException {
CommandTest t = new CommandTest();
t.start(args);
}
CommandTest.java
public class CommandTest {
void start(String[] args) throws ParseException {
//***Definition Stage***
// create Options object
Options options = new Options();
// add option "-a"
options.addOption(
Option.builder("a")
.longOpt("add")
.desc("add numbers")
.hasArg(false)
.valueSeparator('=')
.required(false)
.build()
);
// add option "-m"
options.addOption("m", false, "");
options.addOption(
Option.builder("m")
.longOpt("multiply")
.desc("multiply numbers")
.hasArg(false)
.valueSeparator('=')
.required(false)
.build()
);
//***Parsing Stage***
//Create a parser
CommandLineParser parser = new DefaultParser();
//parse the options passed as command line arguments
CommandLine cmd = parser.parse( options, args);
//***Interrogation Stage***
//hasOptions checks if option is present or not
if(cmd.hasOption("a")) {
System.out.println("Sum of the numbers: " + getSum(args));
} else if(cmd.hasOption("m")) {
System.out.println("Multiplication of the numbers: " + getMultiplication(args));
}
}
public static int getSum(String[] args) {
int sum = 0;
for(int i = 1; i < args.length ; i++) {
sum += Integer.parseInt(args[i]);
}
return sum;
}
public static int getMultiplication(String[] args) {
int multiplication = 1;
for(int i = 1; i < args.length ; i++) {
multiplication *= Integer.parseInt(args[i]);
}
return multiplication;
}
}
现在,我的问题是,当我尝试使用它的参数执行上述代码时,-multi
仍然会被接受吗?我已经将选项设置为仅接收-m
或-multiply
。但是,它仍然会接受-multi
我正在使用 commons-cli-1.3.1 (我试图顺便调试遗留代码)
注意:上面的源只是一个示例源,不需要应用实际的编码指南(好或坏)我只想知道为什么会发生这种行为。
解决方案
这是找到不匹配选项时的行为(org.apache.commons.cli.Options:233):
public List<String> getMatchingOptions(String opt) {
opt = Util.stripLeadingHyphens(opt);
List<String> matchingOpts = new ArrayList();
if (this.longOpts.keySet().contains(opt)) {
return Collections.singletonList(opt);
} else {
Iterator var3 = this.longOpts.keySet().iterator();
while(var3.hasNext()) {
String longOpt = (String)var3.next();
/******************************************************/
/* longOpt = "multiply" */
/* opt = "multi" */
/******************************************************/
if (longOpt.startsWith(opt)) {
matchingOpts.add(longOpt);
}
/******************************************************/
}
return matchingOpts;
}
}
正如您在突出显示的块中所见,如果短选项不匹配,则库将搜索与输入的选项部分匹配的第一个长选项。它使用startsWith
, 并且默认为"multiply".startsWith("multi")
option 。true
--multiply
推荐阅读
- bash - Bash,需要对变量进行计数,舍入到2并存储到变量
- c++ - C++ 标准中“restrict”关键字/属性的情况
- c++ - 标准输入流使用的内部缓冲区 (pubsetbuf)
- javascript - 如何使用 Chart.js 在标签中放置新行?
- c# - 数据库连接和位图是托管还是非托管资源?
- c - 函数何时出现在 .plt 中?
- javascript - Google Chrome 中常规和性能分析器模式之间的区别
- html - 如何在相对父级和相对子级上使用 z-index?
- python - 如何使用 2D x/y 和 1D 时间坐标重新网格化 3D DataArray?
- line-breaks - 如何在合并字段中的每个项目之间放置换行符(出于格式化目的)