5

Tôi đã xem các tài liệu nhưng không thể xem cách lấy CLI của Apache Commons để xử lý tùy chọn "dấu gạch nối kép" mà thường chấm dứt xử lý tùy chọn.Làm thế nào để Apache CLI xử lý dấu gạch ngang kép?

Hãy xem xét các dòng lệnh sau đây trong đó có một tùy chọn "-opt" có thể mất một đối số tùy chọn mà không được chỉ định:

MyProgram -opt -- param1 param2 

Tôi muốn các tùy chọn để kết thúc với không có đối số trong trường hợp này, nhưng Apache trả về "-" làm đối số. Nếu tùy chọn được phép cho nhiều hơn một đối số, thì một số hoặc tất cả các tham số sẽ được trả về dưới dạng đối số.

Đây là mẫu mã minh họa vấn đề này:

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

Bạn đang sử dụng phiên bản mới nhất Apache Commons CLI ** 1.2 **? –

+0

Có, tôi đang sử dụng 1,2 – MykennaC

+0

Sau đó, 'PosixParser' bên dưới sẽ hoạt động. Xem [PosixParser.java] (http://javasourcecode.org/html/open-source/commons-cli/commons-cli-1.2/org/apache/commons/cli/PosixParser.java.html) mã nguồn: nó xử lý với '--' (xem' private void processNonOptionToken (giá trị String, boolean stopAtNonOption) 'tại dòng 182). –

Trả lời

6

Để xử lý đặc biệt thẻ -- như một tùy chọn terminator, bạn phải sử dụng phân tích cú pháp POSIX.

Sử dụng

CommandLineParser parser = new PosixParser(); 

thay vì

CommandLineParser parser = new GnuParser(); 
+0

Như đã nêu trong các ý kiến ​​OP của tôi (ở trên), chỉ cần chuyển sang PosixParser không giải quyết được vấn đề. – MykennaC

+0

Bạn đã thử chơi với cả tùy chọn 'true' và' false' 'stopAtNonOption' chưa?Nếu điều đó không hiệu quả, thì Apache Commons CLI không tuân thủ [Các quy ước POSIX cho các đối số dòng lệnh] (http://www.iam.ubc.ca/guides/javatut99/essential/attributes/_posix.html) và tôi sẽ tự nộp một bản báo cáo lỗi –

+0

Có. Giá trị stopAtNonOption không quan trọng, đối với GnuParser hoặc PosixParser. Chương trình thử nghiệm của tôi ở trên có thể dễ dàng chứng minh điều này. Quan sát kết quả cho trường hợp thử nghiệm thứ ba không bao giờ thay đổi. Để củng cố điểm, hãy thêm một trường hợp thử nghiệm cho "-opt - -opt2". – MykennaC

Các vấn đề liên quan