Przyjrzałem się dokumentom, ale nie widzę sposobu, aby uzyskać interfejs CLI Apache Commons, aby obsłużyć opcję "podwójnego łącznika", która zwykle kończy przetwarzanie opcji.Jak uzyskać interfejs Apache CLI do obsługi podwójnego myślnika?
Rozważmy następujący wiersz polecenia, który ma „-opt” opcja, która może potrwać opcjonalny argument, który nie jest określone:
MyProgram -opt -- param1 param2
Chcę opcja skończyć bez argumentów w tej sprawie, ale Apache zwraca "-" jako argument. Jeśli opcja pozwoliła na więcej niż jeden argument, niektóre lub wszystkie parametry zostaną zwrócone jako argumenty.
Oto przykładowy kod ilustrujący problem:
package com.lifetouch.commons.cli;
import java.util.Arrays;
import org.apache.commons.cli.*;
public class DoubleHyphen {
private static Options options = new Options();
public static void main(String args[]) {
// One required option with an optional argument:
@SuppressWarnings("static-access")
OptionBuilder builder = OptionBuilder.isRequired(true).
withDescription("one optional arg").
withArgName("optArg").hasOptionalArgs(1);
options.addOption(builder.create("opt"));
// Illustrate the issue:
doCliTest(new String[] { "-opt"});
doCliTest(new String[] { "-opt", "optArg", "param"});
doCliTest(new String[] { "-opt", "--", "param"});
// What I want is for the double-dash to terminate option processing.
// Note that if "opt" used hasOptionalArgs(2) then "param" would be a second
// argument to that option (rather than an application parameter).
}
private static void doCliTest(String[] args) {
System.out.println("\nTEST CASE -- command line items: " + Arrays.toString(args));
// Parse the command line:
CommandLine cmdline = null;
try {
CommandLineParser parser = new GnuParser();
cmdline = parser.parse(options, args); // using stopAtNonOption does not help
} catch (ParseException ex) {
System.err.println("Command line parse error: " + ex);
return;
}
// Observe the results for the option and argument:
String optArgs[] = cmdline.getOptionValues("opt");
if (null == optArgs) {
System.out.println("No args specified for opt");
} else {
System.out.println(optArgs.length + " arg(s) for -opt option: " +
Arrays.toString(optArgs));
}
// Observe the results for the command-line parameters:
String tmp = Arrays.toString(cmdline.getArgList().toArray());
System.out.println(cmdline.getArgList().size() +
" command-line parameter(s): " + tmp);
}
}
Czy korzystasz z najnowszej wersji Apache Commons CLI ** 1,2 **? –
Tak, używam 1.2 – MykennaC
Następnie powinien działać poniższy "PosixParser". Zobacz [PosixParser.java] (http://javasourcecode.org/html/open-source/commons-cli/commons-cli-1.2/org/apache/commons/cli/PosixParser.java.html) kod źródłowy: transakcja z '--' (zobacz proces' private void processNonOptionToken (String value, boolean stopAtNonOption) 'w linii 182). –