【发布时间】:2020-03-30 14:32:34
【问题描述】:
我正在使用存在选项类的 cli-commons 1.4 库。我在我的类 CLIReader.java 下创建一个选项类的对象。这是我的代码:
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.log4j.Logger;
public class CLIReader {
private String user = "";
private String password = "";
private String serverUrl = "";
private String streamName = "";
private static String compList;
private static String completeLogger;
public boolean readCommandLineParameters(String[] args) {
Logger log = Logger.getLogger(CLIReader.class);
Options options = new Options();
Option helpOpt = Option.builder("h").longOpt("help").desc("Usage Help").build();
options.addOption(helpOpt);
Option serverurl = Option.builder("url").longOpt("server url").desc("Server url").required().hasArg().argName("url").build();
options.addOption(serverurl);
Option userOpt = Option.builder("u").longOpt("user").desc("User Name").hasArg().argName("user").required().build();
options.addOption(userOpt);
Option pwdOpt = Option.builder("p").longOpt("password").desc("user password").hasArg().argName("password").required().build();
options.addOption(pwdOpt);
Option streamOpt = Option.builder("s").longOpt("streamName").desc("Stream Name").hasArg().argName("streamName").required().build();
options.addOption(streamOpt);
Option configOpt = Option.builder("c").longOpt("componentList").desc("ComponentListPath").hasArg().argName("compList").required().build();
options.addOption(configOpt);
Option completeLoggerOpt = Option.builder("v").longOpt("completeLogger").desc("Complete Logger Info + Errors").hasArg().argName("yes/no").required().build();
options.addOption(completeLoggerOpt);
try {
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse(options, args, true);
if (cmd.hasOption("h")) {
System.out.println("p");
return false;
}
serverUrl = cmd.getOptionValue("url");
user = cmd.getOptionValue("u");
password = cmd.getOptionValue("p");
streamName = cmd.getOptionValue("s");
compList = cmd.getOptionValue("c");
completeLogger = cmd.getOptionValue("v").toLowerCase();
}
catch (Exception e) {
log.info(e.getMessage());
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("User", options, true);
return false;
}
return true;
}
public String getUser() {
return user;
}
public String getPassword() {
return password;
}
public String getServerUrl() {
return serverUrl;
}
public String getStreamName() {
return streamName;
}
public String getcompList() {
return compList;
}
public String getcompleteLogger() {
return completeLogger;
}
}
我有两种情况,就是
场景 1
当我在命令行提示符中传递此命令时:
java -jar abc.jar -u stack -p stackoverflow91 -url https://www.google.com -s streamA -c D:\abc.txt -v
我得到输出:
INFO - Missing required options: v
usage: abc -c <compList> [-h] -p <password> -s <streamName>
-u <user> -url <url> -v <yes/no>
-c,--componentList <compList> ComponentListPath
-h,--help Usage Help
-p,--password <password> user password
-s,--streamName <streamName> Stream Name
-u,--user <user> User Name
-url,--server url <url> Server url
-v,--completeLogger <yes/no> Complete Logger Info + Errors
这是正确的,因为缺少v 的值
场景 2
当我在命令行提示符中传递此命令时:
java -jar abc.jar -h 或 java -jar abc.jar -help
我得到输出:
INFO - Missing required options:url,s,u,p,c v
usage: abc -c <compList> [-h] -p <password> -s <streamName>
-u <user> -url <url> -v <yes/no>
-c,--componentList <compList> ComponentListPath
-h,--help Usage Help
-p,--password <password> user password
-s,--streamName <streamName> Stream Name
-u,--user <user> User Name
-url,--server url <url> Server url
-v,--completeLogger <yes/no> Complete Logger Info + Errors
但是我想要的是当我通过这个命令时,
java -jar abc.jar -h 或 java -jar abc.jar -help
我希望我的输出为“p”,即 if 条件中的消息。
谁能帮我解决上面代码中我做错了什么?
试用-1
public boolean readCommandLineParameters(String[] args) {
Logger log = Logger.getLogger(CLIReader.class);
Options options = new Options();
boolean hasHelp= false;
Option helpOpt = Option.builder("h").longOpt("help").desc("Usage Help").build();
options.addOption(helpOpt);
Option serverurl = Option.builder("url").longOpt("server url").desc(" Server url").required().hasArg().argName("url").build();
options.addOption(serverurl);
Option userOpt = Option.builder("u").longOpt("user").desc("User Name").hasArg().argName("user").required().build();
options.addOption(userOpt);
Option pwdOpt = Option.builder("p").longOpt("password").desc(" user password").hasArg().argName("password").required().build();
options.addOption(pwdOpt);
//Stream Option added
Option streamOpt = Option.builder("s").longOpt("streamName").desc("Stream Name").hasArg().argName("streamName").required().build();
options.addOption(streamOpt);
Option configOpt = Option.builder("c").longOpt("componentList").desc("ComponentListPath").hasArg().argName("compList").required().build();
options.addOption(configOpt);
Option completeLoggerOpt = Option.builder("v").longOpt("completeLogger").desc("Complete Logger Info + Errors").hasArg().argName("yes/no").required().build();
options.addOption(completeLoggerOpt);
try {
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse(options, args, true);
}
if (cmd.hasOption(helpOpt.getOpt()) || cmd.hasOption(helpOpt.getLongOpt())) {
System.out.println("yes");
hasHelp = true;
}
serverUrl = cmd.getOptionValue("url");
user = cmd.getOptionValue("u");
password = cmd.getOptionValue("p");
streamName = cmd.getOptionValue("s");
compList = cmd.getOptionValue("c");
completeLogger = cmd.getOptionValue("v").toLowerCase();
}
catch (Exception e) {
log.info(e.getMessage());
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("Abc ", options, true);
}
return hasHelp;
}
【问题讨论】:
-
看到这个问题:Required options contradicts with help option。你遇到了同样的问题。
-
@andrewjames 感谢您的快速支持,但对我没有用
-
我尝试了相同的代码,但现在结果也一样
-
好的 - 明白,但我不知道什么是“相同的代码”,或者你是如何使用它的。你能展示你修改后的代码吗?您可以编辑您的问题,或提出一个新问题。
-
@andrewjames 我已经发布了编辑后的代码,请查看tryout-1部分下的代码,谢谢
标签: java command-line