文章摘要(AI生成)
以下部分描述了一些有关如何在应用程序中使用 CLI 的示例场景。使用一个boolean选项布尔选项在命令行上由选项的存在表示,即如果找到选项,则选项值为true,否则值为false。DateApp 实用程序将当前日期打印到标准输出。 如果存在 -t 选项,则还会打印当前时间。创建选项创建选项对象并添
以下部分描述了一些有关如何在应用程序中使用 CLI 的示例场景。
使用一个boolean
选项
布尔选项在命令行上由选项的存在表示,即如果找到选项,则选项值为true
,否则值为false
。
DateApp
实用程序将当前日期打印到标准输出。 如果存在 -t 选项,则还会打印当前时间。
创建选项
创建选项对象并添加选项:
// create Options object
Options options = new Options();
// add t option
options.addOption("t", false, "display current time");
addOption
方法有三个参数。 第一个参数是代表选项的 java.lang.String
。 第二个参数是一个布尔值,指定选项是否需要参数。 在布尔选项(有时称为标志)的情况下不存在参数值,因此传递了 false。 第三个参数是选项的描述。 此描述将在应用程序的使用文本中使用。
解析命令行参数
CommandLineParser
的解析方法用于解析命令行参数。 CommandLineParser
接口可能有多种实现,推荐的一种是 DefaultParser
。
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse(options, args);
现在我们需要检查 t 选项是否存在。 为此,我们将询问 CommandLine 对象。 hasOption 方法接受一个 java.lang.String 参数,如果存在 java.lang.String 表示的选项,则返回 true,否则返回 false。
if(cmd.hasOption("t")) {
// print the date and time
}
else {
// print the date
}
笔记。
从 1.5 版开始,DefaultParser
的构造函数现在具有签名 DefaultParser(final boolean allowPartialMatching)
的覆盖。 给定以下代码:
final Options options = new Options();
options.addOption(new Option("d", "debug", false, "Turn on debug."));
options.addOption(new Option("e", "extract", false, "Turn on extract."));
options.addOption(new Option("o", "option", true, "Turn on option with argument."));
我们将“部分匹配”定义为 -de 仅匹配“调试”选项。 因此,我们现在可以关闭它并让 -de 匹配调试选项和提取选项。
国际时间
InternationalDateApp
实用程序通过提供打印世界上任何国家/地区的日期和时间的能力来扩展 DateApp
实用程序。 为了促进这一点,引入了一个新的命令行选项 c。
// add c option
options.addOption("c", true, "country code");
这次第二个参数为真。 这指定 c 选项需要一个参数值。 如果在命令行上指定了所需的选项参数值则返回,否则返回 null。
检索参数值
CommandLine 的 getOptionValue 方法用于检索选项的参数值。
// get c option value
String countryCode = cmd.getOptionValue("c");
if(countryCode == null) {
// print default date
}
else {
// print date for country specified by countryCode
}
以 Ant 为例
这里将使用 Ant 来说明如何创建所需的 Options。 以下是 Ant 的帮助输出。
ant [options] [target [target2 [target3] ...]]
Options:
-help print this message
-projecthelp print project help information
-version print the version information and exit
-quiet be extra quiet
-verbose be extra verbose
-debug print debugging information
-emacs produce logging information without adornments
-logfile <file> use given file for log
-logger <classname> the class which is to perform logging
-listener <classname> add an instance of class as a project listener
-buildfile <file> use given buildfile
-D<property>=<value> use value for given property
-find <file> search for buildfile towards the root of the
filesystem and use it
定义布尔选项
让我们为应用程序创建布尔选项,因为它们最容易创建。 为清楚起见,此处使用了 Option 的构造函数。
Option help = new Option("help", "print this message");
Option projecthelp = new Option("projecthelp", "print project help information");
Option version = new Option("version", "print the version information and exit");
Option quiet = new Option("quiet", "be extra quiet");
Option verbose = new Option("verbose", "be extra verbose");
Option debug = new Option("debug", "print debugging information");
Option emacs = new Option("emacs",
"produce logging information without adornments");
定义参数选项
参数选项是使用 Option#Builder 创建的。
Option logfile = Option.builder("logfile")
.argName("file")
.hasArg()
.desc("use given file for log")
.build();
Option logger = Option.builder("logger")
.argName("classname")
.hasArg()
.desc("the class which it to perform logging")
.build();
Option listener = Option.builder("listener")
.argName("classname")
.hasArg()
.desc("add an instance of class as "
+ "a project listener")
.build();
Option buildfile = Option.builder("buildfile")
.argName("file")
.hasArg()
.desc("use given buildfile")
.build();
Option find = Option.builde("find")
.argName("file")
.hasArg()
.desc("search for buildfile towards the "
+ "root of the filesystem and use it")
.build();
定义 Java 属性选项
最后一个创建选项是 Java 属性,它也是使用 OptionBuilder 创建的。
Option property = Option property = Option.builder("D")
.hasArgs()
.valueSeparator('=')
.build();
稍后可以通过在命令行上调用 getOptionProperties(“D”) 来检索此选项指定的属性映射。
创建选项
现在我们已经创建了每个选项,我们需要创建选项实例。 这是使用 Options 的 addOption 方法实现的
Options options = new Options();
options.addOption(help);
options.addOption(projecthelp);
options.addOption(version);
options.addOption(quiet);
options.addOption(verbose);
options.addOption(debug);
options.addOption(emacs);
options.addOption(logfile);
options.addOption(logger);
options.addOption(listener);
options.addOption(buildfile);
options.addOption(find);
options.addOption(property);
现在所有准备工作都完成了,我们现在可以解析命令行参数了。
创建解析器
我们现在需要创建一个 CommandLineParser。 这将使用 Options 指定的规则解析命令行参数并返回 CommandLine 的实例。
public static void main(String[] args) {
// create the parser
CommandLineParser parser = new DefaultParser();
try {
// parse the command line arguments
CommandLine line = parser.parse(options, args);
}
catch (ParseException exp) {
// oops, something went wrong
System.err.println("Parsing failed. Reason: " + exp.getMessage());
}
}
查询命令行
要查看是否已传递选项,请使用 hasOption 方法。 可以使用 getOptionValue 方法检索参数值。
// has the buildfile argument been passed?
if(line.hasOption("buildfile")) {
// initialise the member variable
this.buildfile = line.getOptionValue("buildfile");
}
显示用法和帮助
CLI 还提供了自动生成使用和帮助信息的方法。 这是通过 HelpFormatter 类实现的。
// automatically generate the help statement
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("ant", options);
执行时会产生以下输出:
usage: ant
-D <property=value> use value for given property
-buildfile <file> use given buildfile
-debug print debugging information
-emacs produce logging information without adornments
-file <file> search for buildfile towards the root of the
filesystem and use it
-help print this message
-listener <classname> add an instance of class as a project listener
-logger <classname> the class which it to perform logging
-projecthelp print project help information
-quiet be extra quiet
-verbose be extra verbose
-version print the version information and exit
如果您还需要打印使用说明,则调用 formatter.printHelp(“ant”, options, true) 将生成使用说明以及帮助信息。
创建一个 ls 示例
*nix 世界中使用最广泛的命令行应用程序之一是 ls。 由于 ls 需要大量选项,本示例仅涵盖一小部分选项。 以下是帮助输出的一部分。
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuSUX nor --sort.
-a, --all do not hide entries starting with .
-A, --almost-all do not list implied . and ..
-b, --escape print octal escapes for non-graphic characters
--block-size=SIZE use SIZE-byte blocks
-B, --ignore-backups do not list implied entries ending with ~
-c with -lt: sort by, and show, ctime (time of last
modification of file status information)
with -l: show ctime and sort by name
otherwise: sort by ctime
-C list entries by columns
以下是用于为此示例创建选项的代码。
// create the command line parser
CommandLineParser parser = new DefaultParser();
// create the Options
Options options = new Options();
options.addOption("a", "all", false, "do not hide entries starting with .");
options.addOption("A", "almost-all", false, "do not list implied . and ..");
options.addOption("b", "escape", false, "print octal escapes for non-graphic "
+ "characters");
options.addOption(Option.builder("SIZE").longOpt("block-size")
.desc("use SIZE-byte blocks")
.hasArg()
.build());
options.addOption("B", "ignore-backups", false, "do not list implied entries "
+ "ending with ~");
options.addOption("c", false, "with -lt: sort by, and show, ctime (time of last "
+ "modification of file status information) with "
+ "-l:show ctime and sort by name otherwise: sort "
+ "by ctime");
options.addOption("C", false, "list entries by columns");
String[] args = new String[]{ "--block-size=10" };
try {
// parse the command line arguments
CommandLine line = parser.parse(options, args);
// validate that block-size has been set
if (line.hasOption("block-size")) {
// print the value of block-size
System.out.println(line.getOptionValue("block-size"));
}
}
catch (ParseException exp) {
System.out.println("Unexpected exception:" + exp.getMessage());
}
评论区