5

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); 
    } 
} 
+0

Czy korzystasz z najnowszej wersji Apache Commons CLI ** 1,2 **? –

+0

Tak, używam 1.2 – MykennaC

+0

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). –

Odpowiedz

6

W celu obsługi specjalnego tokena -- jako terminator opcji, należy użyć parsera POSIX.

Zastosowanie

CommandLineParser parser = new PosixParser(); 

zamiast

CommandLineParser parser = new GnuParser(); 
+0

Jak zauważono w moich komentarzach OP (powyżej), przejście na PosixParser nie rozwiązuje problemu. – MykennaC

+0

Czy próbowałeś grać z opcją 'true' i' false' 'stopAtNonOption'?Jeśli to nie pomoże, Apache Commons CLI nie jest zgodny z [Konwencje POSIX dotyczące argumentów linii poleceń] (http://www.iam.ubc.ca/guides/javatut99/essential/attributes/_posix.html) i będę sam zapisywać w raporcie o błędzie –

+0

Tak. Wartość stopAtNonOption nie ma znaczenia dla GnuParser lub PosixParser. Mój powyższy program testowy może z łatwością to zademonstrować. Obserwować wyniki dla trzeciego przypadku testowego nigdy się nie zmieniają. Aby wzmocnić punkt, dodaj przypadek testowy dla "-opt - -opt2". – MykennaC

Powiązane problemy