Java Apache commons CLI未按预期进行分析?
我正在使用ApacheCommonsCLI库来解析命令行参数,但它似乎并没有按照预期进行解析。不知道我在这里错过了什么Java Apache commons CLI未按预期进行分析?,java,apache-commons,Java,Apache Commons,我正在使用ApacheCommonsCLI库来解析命令行参数,但它似乎并没有按照预期进行解析。不知道我在这里错过了什么 我以多种不同的方式调用,只是为了看看它是否有效,下面是其中之一java-jar dbservice.jar--host localhost--port 7514。调用的正确方法是什么?我在文档中没有看到,为了让选项接受参数,必须将hasArg(true)传递给构建器。对于每个选项,添加一个“.hasArg(true)”。使用此参数修改代码并运行测试用例会产生预期的输出 publ
我以多种不同的方式调用,只是为了看看它是否有效,下面是其中之一
java-jar dbservice.jar--host localhost--port 7514
。调用的正确方法是什么?我在文档中没有看到,为了让选项接受参数,必须将hasArg(true)传递给构建器。对于每个选项,添加一个“.hasArg(true)”。使用此参数修改代码并运行测试用例会产生预期的输出
public static void main(String[] args) {
Options options = new Options();
Option hostOption = Option.builder("h")
.longOpt("host")
.required(false)
.build();
Option portOption = Option.builder("p")
.longOpt("port")
.required(false)
.type(Number.class)
.build();
Option serviceNameOption = Option.builder("n")
.longOpt("service_name")
.required(false)
.build();
options.addOption(hostOption);
options.addOption(portOption);
options.addOption(serviceNameOption);
String serviceName = "dbservice"
String host = "localhost";
int port = 7512;
CommandLineParser parser = new DefaultParser();
Server server = new Server();
try {
CommandLine cmd = parser.parse(options, args);
if(cmd.hasOption("host")) {
host = cmd.getOptionValue("host");
System.out.println(host); //gets in here but prints null
}
if (cmd.hasOption("port")) {
port = ((Number)cmd.getParsedOptionValue("port")).intValue();
System.out.println(port); // gets in here but throws a null pointer exception
}
if (cmd.hasOption("service_name")) {
serviceName = cmd.getOptionValue("service_name");
System.out.println(serviceName); // gets in here but prints null
}
} catch(Exception e) {}
}
为了使选项接受参数,必须将hasArg(true)传递给构建器。对于每个选项,添加一个“.hasArg(true)”。使用此参数修改代码并运行测试用例会产生预期的输出
public static void main(String[] args) {
Options options = new Options();
Option hostOption = Option.builder("h")
.longOpt("host")
.required(false)
.build();
Option portOption = Option.builder("p")
.longOpt("port")
.required(false)
.type(Number.class)
.build();
Option serviceNameOption = Option.builder("n")
.longOpt("service_name")
.required(false)
.build();
options.addOption(hostOption);
options.addOption(portOption);
options.addOption(serviceNameOption);
String serviceName = "dbservice"
String host = "localhost";
int port = 7512;
CommandLineParser parser = new DefaultParser();
Server server = new Server();
try {
CommandLine cmd = parser.parse(options, args);
if(cmd.hasOption("host")) {
host = cmd.getOptionValue("host");
System.out.println(host); //gets in here but prints null
}
if (cmd.hasOption("port")) {
port = ((Number)cmd.getParsedOptionValue("port")).intValue();
System.out.println(port); // gets in here but throws a null pointer exception
}
if (cmd.hasOption("service_name")) {
serviceName = cmd.getOptionValue("service_name");
System.out.println(serviceName); // gets in here but prints null
}
} catch(Exception e) {}
}
默认情况下,您会假设用户第一次对hasArg()感到困惑,在不指定hasArg()的情况下,至少会使用一个参数来创建选项。在不传递hasArg()的情况下传递值“--opt val”会自动忽略val,就好像没有传递任何内容一样。如果没有指定hasArg(),那么它应该会失败,因为传递了某些内容而不是忽略。可能是,应该有一个严格的模式?对于第一次使用hasArg()的用户来说,默认情况下,您会假设在不指定hasArg()的情况下,至少会使用一个参数来创建选项。在不传递hasArg()的情况下传递值“--opt val”会自动忽略val,就好像没有传递任何内容一样。如果没有指定hasArg(),那么它应该会失败,因为传递了某些内容而不是忽略。可能是,应该有一个严格模式?我相信如果您要选择一个选项(如localhost或port number),您必须向guilder指定它是一个参数。尝试将.hasArg(true)添加到.build()之前的生成器中。我认为如果要使用某个选项(如localhost或port number),则必须向guilder指定它是一个参数。尝试在.build()之前将.hasArg(true)添加到生成器。它对您有效吗?您是如何传递命令行参数的?在更改代码后,我使用长格式传递参数:
--host localhost--port 1234
。它对您有效吗?如何传递命令行参数?在更改代码后,我使用长格式传递参数:--host localhost--port 1234
。