Пытается использовать Apache Commons Command Line Interface 1.3.1
from here Он отлично работает для требуемых аргументов, но, похоже, упускает любые необязательные аргументы. Может ли кто-нибудь выявить проблему с моим кодом ниже?Java Apache CLI Опция командной строки Аргументы не работают
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class TestCommandLine {
public static void main(String[] args) {
// ***** test with command line arguments -R myfirstarg -O mysecondarg *****
// ***** the second arg is not being captured *****
System.out.println("Number of Arguments : " + args.length);
String commandline = "";
for (String arg : args) {
commandline = commandline + (arg + " ");
}
commandline.trim();
System.out.println("Command-line arguments: " + commandline);
// create Options object
Options options = new Options();
options.addOption("R", true, "Enter this required argument");
Option optionalargument = Option.builder("O")
.optionalArg(true) // if I change this line to .hasArg(true) it works, but then is not optional
.desc("Enter this argument if you want to")
.build();
options.addOption(optionalargument);
// initialize variables used with command line arguments
String firstargument = null;
String secondargument = null;
CommandLineParser parser = new DefaultParser();
try {
// parse the command line arguments
CommandLine cmd = parser.parse(options, args);
firstargument = cmd.getOptionValue("R");
secondargument = cmd.getOptionValue("O");
if(cmd.hasOption("R")){
if(firstargument == null){
System.out.println("Must provide the first argument ... exiting...");
System.exit(0);
}
else {
System.out.println("First argument is " + firstargument);
}
}
if(cmd.hasOption("O")) {
// optional argument
if (secondargument == null){
System.out.println("Second argument is NULL");
}
else{
// should end up here if optional argument is provided, but it doesn't happen
System.out.println("Second argument is " + secondargument);
}
}
}
catch(ParseException exp) {
// oops, something went wrong
System.err.println("Parsing failed. Reason: " + exp.getMessage());
}
}
}
Выход из приведенного выше кода:
Number of Arguments : 4
Command-line arguments: -R myfirstarg -O mysecondarg
First argument is myfirstarg
Second argument is NULL
Почему не "mysecondarg" захвата? Если я изменяю строку .optionalArg (true) на .hasArg (true), тогда второй аргумент захватывается, но вся идея состоит в том, чтобы иметь возможность опционально оставить второй аргумент.
Что делать, если вы установите для него количество аргументов? – ohshazbot
@ohshazbot: не уверен, что я следую этому вопросу, но если я укажу, что аргумент должен быть предоставлен для опции -O, тогда код работает - до тех пор, пока пользователь предоставляет аргумент. Но в реальном приложении пользователь должен иметь возможность выбирать -O, а затем необязательно либо предоставлять аргумент, либо нет. – BunkerBob
В построителе есть дополнительный флаг, который не задает, если есть/не являются аргументами, но для установки числа аргументов. Это numberOfArgs – ohshazbot