Details
Description
I found a weakness of Jakarta Commons CLI and want to explain it with a simple
example:
Our program provides 2 options:
1. -a or --algo <name>: The -a option requires an argument.
2. -k or --key <value>: The -k option requires an argument too.
a)
If you pass the following command line arguments everything will be ok:
-a Caesar -k A
After evaluation:
• "Caesar" is the parameter of the -a option and
• "A" is the parameter of the -k option.
b)
However an org.apache.commons.cli.MissingArgumentException: no argument for:k is
thrown if you pass the following input:
-a Caesar -k a
The Parser assumes that the argument "a" after the -k option, is the -a option
missing the hyphen. At the end of this description there is Java code for
executing this problem.
Information:
The handling of this command line
-a Caesar -k a
works in Getopt without any problem:
• "Caesar" is the parameter of the -a option and
• "a" of the -k option.
After parsing a valid option Getopt always takes the next (available) command
line argument as the option's parameter if the option requires an argument -
means if you pass to the command line
-k -a Caesar
After evaluation:
• "a" is the parameter of the -k option
• the "Caesar" argument is just ignored
If the option's parameter (<value>) represents an optional argument the next
argument is not required, if it represents a valid option - means if you pass to
the command line
-k -a Caesar
After evaluation:
• "Caesar" is the parameter of the -a option
• k option is set without a parameter - in this case a default value makes sense.
Last but not least here is the code snippet for the CLI Test:
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
public class TestCommonsCLI {
/**
- @param args
*/
public static void main(String[] args) {
Options options = new Options();
Option algorithm = new Option("a" , "algo", true, "the algorithm which it to
perform executing");
algorithm.setArgName("algorithm name");
options.addOption(algorithm);
Option key = new Option("k" , "key", true, "the key the setted algorithm uses
to process");
algorithm.setArgName("value");
options.addOption(key);
CommandLineParser parser = new PosixParser();
try {
CommandLine line = parser.parse( options, args);
if(line.hasOption('a'))
{ System.out.println("algo: "+ line.getOptionValue( "a" )); }if(line.hasOption('k'))
{ System.out.println("key: " + line.getOptionValue('k')); }} catch (ParseException e)
{ // TODO Auto-generated catch block e.printStackTrace(); }}
}
Attachments
Attachments
Issue Links
- is related to
-
CLI-148 arguments are interpreted as options
- Closed
svn ci -m "Applying Brian Egge and my work from
CLI-71to fix a lingering data problem in the parser and to confirm that other bugs have already been fixed" src/Sending src/java/org/apache/commons/cli/Option.java
Sending src/java/org/apache/commons/cli/Parser.java
Adding src/test/org/apache/commons/cli/OptionTest.java
Adding src/test/org/apache/commons/cli/bug/BugCLI71Test.java
Transmitting file data ....
Committed revision 541408.