使用 commons-cli 在 Java 中解析命令行选项

让您的用户使用命令行选项修改 Java 应用程序的运行方式。
39 位读者喜欢这篇文章。

当您在终端中输入命令时,无论是启动 GUI 应用程序还是仅仅是终端应用程序,通常都有 选项(有时称为开关标志)可用于修改应用程序的运行方式。这是 POSIX 规范设置的标准,因此对于 Java 程序员来说,了解如何检测和解析选项非常有用。

在 Java 中解析选项有几种方法。我最喜欢的是 Apache Commons CLI 库,简称 commons-cli

安装 commons-cli

如果您正在使用像 Maven 这样的项目管理系统和 IDE,您可以在项目属性(例如 pom.xml 或 Eclipse 或 NetBeans 中的配置屏幕)中安装 Apache Commons CLI 库。

如果您手动管理库,您可以从 Apache 网站下载 最新版本。有几个 JAR 文件捆绑在一起。唯一需要的 JAR 是 commons-cli-X.Y.jar(其中 X 和 Y 是最新的版本号)。将该 JAR 添加到您的项目,手动或在您的 IDE 中,然后您就可以在您的代码中使用它了。

将库导入到您的 Java 代码中

要在您的代码中使用 commons-cli 库,您必须导入它。对于这个简单的选项解析示例,您可以使用标准的最小代码填充一个名为 Main.java 的文件

package com.opensource.myoptparser;

import org.apache.commons.cli.*;

public class Main {
    public static void main(String[] args) {
    // code 
    }
}

现在您已准备好在 Java 中解析选项了。

在 Java 中定义布尔选项

解析选项时,您必须做的第一件事是定义您的应用程序可以接受的有效选项。使用 Option(单数)类来创建选项对象,并使用 Options(复数)类来帮助跟踪您在项目中创建的所有选项。

首先,为您的选项创建一个组,并按照惯例将其命名为 options

    //code
    Options options = new Options();

接下来,通过列出短选项、长选项、默认布尔值和帮助消息来定义您的单个选项。然后,您设置该选项是否是必需的,最后将该选项添加到 options 对象,其中包含您的所有选项。在这个例子中,我只创建一个选项,任意命名为 alpha

    //define options
    Option alpha = new Option("a", "alpha", false, "Activate feature alpha");
    options.addOption(alpha);

在 Java 中定义带有参数的选项

有时您希望用户提供除 truefalse 之外的其他信息以及选项。您可能希望让用户引用配置文件、输入文件或任何设置,例如日期或颜色。为此,您可以使用 builder 方法,根据选项的短版本(例如,-c 是短选项,--config 是长选项)创建选项的属性。定义后,您可以将新选项添加到您的 options

    Option config = Option.builder("c").longOpt("config")
        .argName("config")
        .hasArg()
        .required(true)
        .desc("set config file").build();
    options.addOption(config);

使用 builder 函数,您可以设置短版本、长版本、是否是必需的(我在代码中将其设置为 true,因此我的应用程序除非用户在启动时提供此选项,否则无法运行)、帮助消息等等。

使用 Java 解析选项

定义了所有可能的选项后,您现在可以迭代用户提供的参数,检查是否有任何参数与您批准的有效短选项列表匹配。为此,您需要创建 CommandLine 本身的实例,其中包含用户提供的所有参数(有效选项和其他参数)。您还需要创建一个 CommandLineParser 对象,我在我的代码中将其称为 parser,以方便与这些参数进行交互。最后,您可以创建一个 HelpFormatter 对象(我称之为 helper),以便在缺少必需的选项或使用 --help-h 选项时自动向用户提供有用的消息。

    // define parser
    CommandLine cmd;
    CommandLineParser parser = new BasicParser();
    HelpFormatter helper = new HelpFormatter();

最后,添加一些条件语句来分析用户作为命令行输入提供的选项(在 cmd 变量中发现和存储)。此示例应用程序有两种不同类型的选项,但在两种情况下,您都可以使用 .hasOption 方法加上短选项名称来检查选项是否存在。检测到选项后,您可以对数据执行任何需要执行的操作。

try {
    cmd = parser.parse(options, args);
    if(cmd.hasOption("a")) {
    System.out.println("Alpha activated");
    }

    if (cmd.hasOption("c")) {
    String opt_config = cmd.getOptionValue("config");
    System.out.println("Config set to " + opt_config);
    }
} catch (ParseException e) {
    System.out.println(e.getMessage());
    helper.printHelp("Usage:", options);
    System.exit(0);
}

解析行为可能会生成错误,因为有时可能缺少必需的 -c--config 选项。在这种情况下,会打印帮助消息,并且应用程序立即结束。由于这个错误(Java 术语中的异常),您必须修改 main 方法的开头以声明可能的异常

public static void main(String[] args) throws ParseException {

示例应用程序现已完成。

测试您的代码

您可以通过调整传递给您的代码的默认参数在您的 IDE 中测试应用程序,或者只是构建一个 JAR 文件并从您的终端运行它。此过程因您的 IDE 而异。请参阅您的 IDE 文档,阅读我的关于如何 构建 JAR 的文章,或参阅 Daniel Oh 关于如何使用 Maven 执行相同操作的文章。

首先,通过省略必需的 -c--config 选项来确认解析器异常

$ java -jar dist/myapp.jar                 
Missing required option: c
usage: Usage:
 -a,--alpha             Activate feature alpha
 -c,--config <config>   Set config file

再次尝试提供选项

java -jar dist/myantapp.jar --config foo -a
Alpha activated
Config set to foo

选项解析

为您的用户包含选项是任何应用程序的重要功能。Java 和 Apache commons 使这项工作变得容易。

这是完整的演示代码供您参考

package com.opensource.myapp;

import org.apache.commons.cli.*;

public class Main {
    
    /**
     * @param args the command line arguments
     * @throws org.apache.commons.cli.ParseException
     */ 
    public static void main(String[] args) throws ParseException {
        // define options
        Options options = new Options();
        
        Option alpha = new Option("a", "alpha", false, "Activate feature alpha");
        options.addOption(alpha);
        
        Option config = Option.builder("c").longOpt("config")
                .argName("config")
                .hasArg()
                .required(true)
                .desc("Set config file").build();
        options.addOption(config);
     
        // define parser
        CommandLine cmd;
        CommandLineParser parser = new BasicParser();
        HelpFormatter helper = new HelpFormatter();

        try {
            cmd = parser.parse(options, args);
            if(cmd.hasOption("a")) {
                System.out.println("Alpha activated");
            }
          
            if (cmd.hasOption("c")) {
                String opt_config = cmd.getOptionValue("config");
                System.out.println("Config set to " + opt_config);
            }
        } catch (ParseException e) {
            System.out.println(e.getMessage());
            helper.printHelp("Usage:", options);
            System.exit(0);
        }
    }
}

使用 Java 和选项

选项允许用户修改命令的工作方式。当使用 Java 时,有很多方法可以解析选项,而 commons-cli 是一个强大而灵活的开源解决方案。在您的下一个 Java 项目中尝试一下。

接下来阅读什么
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,通常同时进行。

评论已关闭。

© . All rights reserved.