gstackoverflow
gstackoverflow

Reputation: 37034

How to pass (and after get) array of parameters with Commons CLI?

I have following code:

options.addOption(OptionBuilder.withLongOpt(SOURCES)
                .withDescription("path to sources")
                .hasArg()
                .withArgName("PATHS")
                .create());
...
CommandLineParser parser = new GnuParser();
line = parser.parse(options, args);
...
System.out.println(line.getOptionValues(SOURCES));

I invoke application with parameters

-sources=path1, path2

in result I see ["path1"]

I want to get both arguments. How can I pass it?

what should I write in command line

Upvotes: 2

Views: 5663

Answers (2)

izstas
izstas

Reputation: 5064

If you want to pass an array, you should replace hasArg() with hasArgs() to indicate that the option may have multiple values. Now you can pass them like this:

-sources path1 path2

If you want to be able to pass them comma-separated, you can call withValueSeparator(',') on your OptionBuilder, resulting in code like the following:

options.addOption(OptionBuilder.withLongOpt(SOURCES)
    .withDescription("path to sources")
    .hasArgs()
    .withValueSeparator(',')
    .withArgName("PATHS")
    .create());

Now you can pass them this way:

-sources path1,path2

Keep in mind, however, that space will still be treated as a separator.

Upvotes: 5

martinez314
martinez314

Reputation: 12332

Make the argument values space-delimited, rather than comma-delimited:

-source=path1 path2

Also, you need to use .hasArgs() rather than .hasArg() to return more than one argument value. You can also specify .hasArgs(2) for an explicit number of argument values. Here's a working example:

Input: -source=path1 path2

public class Test {

    public static void main(String[] args) {
        Options options = new Options();
        options.addOption(OptionBuilder.withLongOpt("sources").withDescription("path to sources").hasArgs().withArgName("PATHS").create());

        CommandLineParser parser = new GnuParser();
        CommandLine line = null;

        try {
            line = parser.parse(options, args, true);
        } catch (ParseException exp) {
            System.err.println("Parsing failed.  Reason: " + exp.getMessage());
        }

        System.out.println(Arrays.toString(line.getOptionValues("sources")));
    }
}

Output: [path1, path2]

Upvotes: 5

Related Questions