Hello Adalbert,

> Am 14.03.2017 um 15:36 schrieb [email protected]:
> 
> Hi there,
> 
> I'm trying to implement a command line parser using Apache Commons CLI v. 1.2 
> (unfortunately I am forced to use that version). The syntax to be accepted is 
> quite simple:
> 
> MyProg [ -x path[:path]... ] [ file1 ... ]
> 
> Option '-x' should accept a search path like sequence of directories 
> (separated by ':') optionally followed by zero or more file names. My code 
> looks as follows:
> 
> Option dbPath = OptionBuilder.withLongOpt("db_path")
>                             .withDescription("DB search path")
>                             .hasArgs()
>                             .withValueSeparator(':')
>                             .withArgName("Path[:Path]...")
>                             .create('x');
> Options opts = new Options();
> opts.addOption(dbPath);
> 
> String[] args = new String[] { "-x", "path1:path2", "file1", "file2" };
> 
> CommandLineParser parser = new PosixParser();
> CommandLine cmdLine = null;
> try {
>    cmdLine = parser.parse(opts, args);
> } catch (ParseException ex) {
>    System.out.println("Syntax error: " + ex.getMessage());
>    return;
> }
> if (cmdLine.hasOption('x')) {
>    for (String path : cmdLine.getOptionValues('x'))
>        System.out.println("path: " + path);
> }
> for (Object file : cmdLine.getArgList()) {
>    System.out.println("file: " + file);
> }
> 
> Surprisingly this doesn't function as expected. This is the output I get:
> 
> path: path1
> path: path2
> path: file1
> path: file2
> 
> Not only the two '-x' option values ('path1', 'path2') but also the file 
> arguments are returned when the getOptionValues('x') function is called. No 
> matter which parser class I use (BasicParser, GnuParser or PosixParser), the 
> result is always the same.
> 
> What am I doing wrong?

I think what you’re trying to achieve is currently not possible with CLI. 
Here’s the JavaDoc of withValueSeparator(char):

 Option opt = OptionBuilder.withValueSeparator('=')
                           .create('D');

 String args = "-Dkey=value";
 CommandLine line = parser.parse(args);
 String propertyName = opt.getValue(0);  // will be "key"
 String propertyValue = opt.getValue(1); // will be "value"
So the value separator is used to define key-value pair options.

Benedikt

> 
> Adalbert.
> 

Reply via email to