2013-06-18 27 views
25

Đối với một CLI, tôi có một yêu cầu để chuyển vào một mảng ints làm đầu vào cho một tùy chọn cụ thể.Apache Commons CLI: Lấy danh sách các giá trị cho một tùy chọn

Ví dụ - Lệnh dưới đây sẽ lấy một mảng customerIds và thực hiện một số thao tác.

myCommand -c 123 124 125

tôi đã thực hiện CLI bằng Apache commons CLI, và tôi đang sử dụng getOptionValues ​​("c") để lấy mảng này.

Vấn đề là, điều này chỉ trả lại phần tử đầu tiên trong mảng, tức là [123], trong khi tôi dự kiến ​​nó sẽ trả về [123, 124, 125].

Một phiên bản đặc của mã của tôi,

CommandLine cmd; 
CommandLineParser parser = new BasicParser(); 
cmd = parser.parse(options, args); 
if (cmd.hasOption("c")){ 
String[] customerIdArray = cmd.getOptionValues("c"); 
// Code to parse data into int 
} 

Ai đó có thể giúp tôi xác định vấn đề ở đây?

Trả lời

24

Bạn phải thiết lập tối đa số lượng các tham số giá trị tùy chọn có thể mất, nếu không nó giả định lựa chọn duy nhất có giá trị 1 lập luận

Options options = new Options(); 
Option option = new Option("c", "c desc"); 
// Set option c to take maximum of 10 arguments 
option.setArgs(10); 
options.addOption(option); 
+3

Và nếu số lượng giá trị đối số tối đa không xác định? Có thể có cú pháp với khung hình \t không? – Zangdak

31

Tôi muốn thêm này ở đây như một câu trả lời cho @Zangdak và thêm các phát hiện của tôi vào cùng một vấn đề.

Nếu bạn không gọi #setArgs(int) thì một RuntimeException sẽ xảy ra. Khi bạn biết số lượng đối số chính xác tối đa cho tùy chọn này, thì hãy đặt giá trị cụ thể này. Khi giá trị này không được biết, lớp Tùy chọn có một hằng số cho nó: Option.UNLIMITED_VALUES

Điều này sẽ thay đổi gerrytans trả lời như sau:

Options options = new Options(); 
Option option = new Option("c", "c desc"); 
// Set option c to take 1 to oo arguments 
option.setArgs(Option.UNLIMITED_VALUES); 
options.addOption(option); 
+0

Vâng, đó là những gì tôi đã làm nhưng tôi muốn có một cú pháp giống như sau: 'cmd -opt1 {V1 V2 ... Vn} arg' nhưng có vẻ như doen't tồn tại nên tôi chỉ đặt đối số trước các tùy chọn giá trị không giới hạn. – Zangdak

+1

@Zangdok Nếu tôi hiểu chính xác bạn, điều này đưa tôi đến cùng một câu hỏi, UNLIMITED_VALUES không có vấn đề gì để có một tùy chọn khác sau tất cả các giá trị đó. Tôi có thể xác nhận, rằng một cái gì đó như 'cmd --opt = {V1 V2 ... Vn} -o --debug' đang hoạt động – VeikkoW

+0

Không, một tùy chọn khác sau khi một tùy chọn có giá trị không giới hạn hoạt động tốt. Tôi muốn có một cuộc tranh cãi sau lựa chọn đó. Dù sao, tôi sẽ thử cú pháp của bạn. – Zangdak

5

Dường như tôi hơi muộn cho bữa tiệc nhưng apache commons cli phát triển và bây giờ (ít nhất là trong 1.3.1), chúng tôi có một cách mới để đặt rằng có thể có số lượng đối số không giới hạn

Option c = Option.builder("c") 
     .hasArgs() // sets that number of arguments is unlimited 
     .build(); 
     Options options = new Options(); 
     options.addOption(c); 
+1

Nếu bạn đang gọi hasArgs() thì hasArg() gọi là redundand – jnowakow

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