当您在终端中输入命令时,无论是启动 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 中定义带有参数的选项
有时您希望用户提供除 true 或 false 之外的其他信息以及选项。您可能希望让用户引用配置文件、输入文件或任何设置,例如日期或颜色。为此,您可以使用 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 项目中尝试一下。
评论已关闭。