Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Getting Option Values

Header Image

Ahoy mateys! Welcome back to our pirate-themed instructional website where we explore the world of command line interfaces. In this article, we will delve into the topic of retrieving option values from the parsed command line using Apache Commons CLI.

As ye may recall from our previous articles, Apache Commons CLI is a powerful library that can help ye parse command line arguments in yer Java applications. With Apache Commons CLI, ye can easily define and parse command line options, arguments, and flags. In this article, we will focus on how to retrieve option values from the parsed command line using Apache Commons CLI.

Retrieving Option Values from the Parsed Command Line

Once ye have defined yer command line options and parsed the command line arguments using Apache Commons CLI, ye can retrieve the option values from the parsed command line. To retrieve the value of an option, ye need to use the CommandLine object that ye obtained from parsing the command line arguments.

Let’s consider an example where we have defined a command line option -name that takes a string value. To retrieve the value of this option, ye can use the getOptionValue method of the CommandLine object as shown below:

Options options = new Options();
Option nameOption = Option.builder("name")
                            .hasArg()
                            .argName("name")
                            .desc("Name of the pirate")
                            .build();
options.addOption(nameOption);

CommandLineParser parser = new DefaultParser();
try {
    CommandLine cmd = parser.parse(options, args);
    String name = cmd.getOptionValue("name");
    System.out.println("Hello " + name + "!");
} catch (ParseException e) {
    System.err.println("Error: " + e.getMessage());
}

In the above example, we have defined an option -name using the Option.builder method and added it to the Options object. We have then parsed the command line arguments using the DefaultParser and obtained the CommandLine object. Finally, we have retrieved the value of the -name option using the getOptionValue method of the CommandLine object and printed a greeting message to the user.

Ye can also retrieve the values of multiple options at once using the getOptions method of the CommandLine object. This method returns a Map of option names to their corresponding values. Here is an example:

Options options = new Options();
Option nameOption = Option.builder("name")
                            .hasArg()
                            .argName("name")
                            .desc("Name of the pirate")
                            .build();
Option ageOption = Option.builder("age")
                            .hasArg()
                            .argName("age")
                            .desc("Age of the pirate")
                            .build();
options.addOption(nameOption);
options.addOption(ageOption);

CommandLineParser parser = new DefaultParser();
try {
    CommandLine cmd = parser.parse(options, args);
    Map<String, String> optionValues = cmd.getOptionValues();
    String name = optionValues.get("name");
    String age = optionValues.get("age");
    System.out.println(name + " is " + age + " years old.");
} catch (ParseException e) {
    System.err.println("Error: " + e.getMessage());
}

In this example, we have defined two options -name and -age, added them to the Options object, and parsed the command line arguments using the DefaultParser. We have then obtained a Map of option values using the getOptions method of the CommandLine object and printed a message to the user.

Handling Missing Option Values

Sometimes, yer users may forget to provide a value for an option or may provide an invalid value. In such cases, yer application may not be able to function as expected. Therefore, it is important to handle missing option values gracefully.

To handle missing option values, ye can use the hasOption method of the CommandLine object to check if an option is present in the command line arguments. If the option is present, ye can retrieve its value using the getOptionValue method. If the option is not present, ye can display a usage message to the user or provide a default value for the option.

Let’s consider an example where we have defined an option -age that takes an integer value. If the user forgets to provide a value for this option, we can display a usage message to the user as shown below:

Options options = new Options();
Option ageOption = Option.builder("age")
                            .hasArg()
                            .argName("age")
                            .desc("Age of the pirate")
                            .build();
options.addOption(ageOption);

CommandLineParser parser = new DefaultParser();
try {
    CommandLine cmd = parser.parse(options, args);
    if (cmd.hasOption("age")) {
        String ageString = cmd.getOptionValue("age");
        int age = Integer.parseInt(ageString);
        System.out.println("Age: " + age);
    } else {
        System.out.println("Usage: pirate -age <age>");
    }
} catch (ParseException e) {
    System.err.println("Error: " + e.getMessage());
}

In this example, we have defined an option -age using the Option.builder method and added it to the Options object. We have then parsed the command line arguments using the DefaultParser and obtained the CommandLine object. We have used the hasOption method to check if the -age option is present in the command line arguments. If the option is present, we have retrieved its value using the getOptionValue method and converted it to an integer. If the option is not present, we have displayed a usage message to the user.

Ye can also provide a default value for an option if the user does not provide a value. To provide a default value, ye can use the getOptionValue method with a second argument that specifies the default value. Here is an example:

Options options = new Options();
Option ageOption = Option.builder("age")
                            .hasArg()
                            .argName("age")
                            .desc("Age of the pirate")
                            .build();
options.addOption(ageOption);

CommandLineParser parser = new DefaultParser();
try {
    CommandLine cmd = parser.parse(options, args);
    int age = Integer.parseInt(cmd.getOptionValue("age", "30"));
    System.out.println("Age: " + age);
} catch (ParseException e) {
    System.err.println("Error: " + e.getMessage());
}

In this example, we have defined an option -age using the Option.builder method and added it to the Options object. We have then parsed the command line arguments using the DefaultParser and obtained the CommandLine object. We have usedthe getOptionValue method with a default value of 30 to retrieve the value of the -age option. If the user does not provide a value for the option, the default value of 30 will be used.

Handling Missing Option Values

In some cases, ye may want to make certain options required and throw an error if they are not provided by the user. In Apache Commons CLI, ye can make an option required by calling the isRequired method on the option object. Here is an example:

Options options = new Options();
Option nameOption = Option.builder("name")
                            .hasArg()
                            .argName("name")
                            .desc("Name of the pirate (required)")
                            .required()
                            .build();
options.addOption(nameOption);

CommandLineParser parser = new DefaultParser();
try {
    CommandLine cmd = parser.parse(options, args);
    String name = cmd.getOptionValue("name");
    System.out.println("Hello " + name + "!");
} catch (ParseException e) {
    System.err.println("Error: " + e.getMessage());
}

In this example, we have marked the -name option as required using the required method. If the user does not provide a value for this option, Apache Commons CLI will throw a MissingOptionException.

Ye can also provide default values for options using the hasArg(boolean) method of the OptionBuilder. If the user does not provide a value for an option that has a default value, the default value will be used instead. Here is an example:

Options options = new Options();
Option nameOption = Option.builder("name")
                            .hasArg()
                            .argName("name")
                            .desc("Name of the pirate (default: Blackbeard)")
                            .hasArg(true)
                            .optionalArg(true)
                            .build();
options.addOption(nameOption);

CommandLineParser parser = new DefaultParser();
try {
    CommandLine cmd = parser.parse(options, args);
    String name = cmd.getOptionValue("name", "Blackbeard");
    System.out.println("Hello " + name + "!");
} catch (ParseException e) {
    System.err.println("Error: " + e.getMessage());
}

In this example, we have provided a default value for the -name option using the getOptionValue method of the CommandLine object. If the user does not provide a value for this option, the default value “Blackbeard” will be used instead.

Conclusion

In this article, we have explored how to retrieve option values from the parsed command line using Apache Commons CLI. We have also seen how to handle missing option values by making options required and providing default values. With Apache Commons CLI, ye can easily define and parse command line options in yer Java applications. We hope ye have found this article informative and entertaining. Till we meet again, fair winds and following seas!