I am using cli-commons 1.4 library under which option class is present. I am creating an object of option class under my class that is CLIReader.java. Here is my code:
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;
}
}
I have two scenarios, that is
Scenario 1
When I pass this command in command line prompt:
java -jar abc.jar -u stack -p stackoverflow91 -url https://www.google.com -s streamA -c D:\abc.txt -v
I get output:
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
which is correct as the value of v
is missing
Scenario 2
When I pass this command in command line prompt:
java -jar abc.jar -h
or java -jar abc.jar -help
I get output:
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
But what I want here is when I pass this command,
java -jar abc.jar -h
or java -jar abc.jar -help
I want my output as "p" which is the message inside if condition.
Can anyone help me out to fine what in the above code I am doing wrong?
Tryout-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;
}