这是我系列的第七篇文章,简要介绍了用于处理Java命令行参数的各种库。 这篇文章回到了基于注释的库的覆盖范围,该库似乎是在Java中可用于处理命令行参数的众多可用库中知名度最高和最受欢迎的库之一: JCommander 。
JCommander的网页上指出:“因为生命太短,无法解析命令行参数”,并且概述将JCommander引入为“一个很小的Java框架,使得解析命令行参数变得微不足道。” 本文中的代码示例和执行代码的关联屏幕快照均基于JCommander 1.72 (2017年6月)。 此处显示的演示的完整代码可在GitHub上找到 。
JCommander使用批注来实现命令行处理的“定义”阶段。 下一个代码清单片段中对此进行了演示。
JCommander的“定义”阶段
/**
* Demonstrates use of JCommander for Java-based command-line processing.
*/
public class Main
{
@Parameter(names={"-v","--verbose"},
description="Enable verbose logging")
private boolean verbose;
@Parameter(names={"-f","--file"},
description="Path and name of file to use",
required=true)
private String file;
@Parameter(names={"-h", "--help"},
description="Help/Usage",
help=true)
private boolean help;
// . . .
final JCommander commander
= JCommander.newBuilder()
.programName("JCommander Demonstration")
.addObject(this)
.build();
刚刚显示的代码清单演示了如何使用JCommander的@Parameter批注通过类字段的批注来定义命令行选项。 这些示例演示了names
说明,以指示与单个选项关联的多个选项标志;提供description
以提供每个选项的说明; required=true
以强制存在命令行参数, help=true
以指示“帮助”。 ”或“使用”命令行参数(指示JCommander如果未提供必需的参数也不要抛出异常)。
通过用@Parameter
注释注释的类属性,可以将带有注释字段的类的实例用于创建JCommander类的实例。 在上面的代码示例中,我利用了JCommander.Builder以获得与使用构建器相关的更大的流利性和其他优势。 特别是,带有注释的类字段的实例是通过addObject(Object)方法添加的。
通过对刚刚实例化的JCommander
实例执行parse(String…)方法的单行调用,可以完成JCommander命令行处理的“解析”阶段。 下一个代码清单对此进行了演示。
使用JCommander进行“解析”阶段
commander.parse(arguments);
使用JCommander进行命令行处理的“询问”阶段涉及简单地访问传递给JCommander
类实例化的实例的带注释的字段。 下一个代码清单对此进行了演示。
JCommander的“审讯”阶段
if (help)
{
commander.usage();
}
else
{
out.println(
"The file name provided is '" + file + "' and verbosity is set to " + verbose);
}
最后一个代码清单演示了确定--help
或-h
规范是否设置名称为help
的boolean
属性的能力。 由于它是一个简单的boolean
,因此可以在条件条件中使用,如果为true
,则可以显示帮助/使用信息。 在未设置“ help”标志的情况下,将访问与其他命令行选项关联的值(“ verbose” / -v
/ --verbose
和“ file” / -f
/ --file
)。
最新的代码清单还演示了如何通过在JCommander
类的实例上调用方法JCommander
()将用法信息写入标准输出。 值得注意的是ParameterException
也有一个usage()方法 。
下一系列屏幕快照演示了如何将JCommander与包含上述代码段的简单应用程序一起使用。 第一个图像显示了不带任何参数运行基于JCommander的应用程序,并显示了在这种情况下显示的ParameterException ,因为未指定必需的--file
/ -f
选项。
当提供了预期的命令行参数时,下一个屏幕快照将演示“正常”执行。
下一个屏幕快照演示了“帮助”选项的使用。 由于使用help=true
进行了注释,因此缺少必需的“文件”命令行参数不会导致异常,并且自动生成的帮助/使用信息将写入标准输出。
JCommander提供了我非常喜欢的用于开发和学习JCommander的功能。 可以通过在JCommandBuilder上调用verbose(int)方法来指定JCommander解析的详细 程度 。
增加JCommander的详细程度
final JCommander commander
= JCommander.newBuilder()
.programName("JCommander Demonstration")
.addObject(this)
.verbose(1)
.build();
随着冗长程度的提高,可以发现对JCommander正在执行的与命令行处理有关的更多信息,并在以下两个屏幕快照中得以证明。
在选择框架或库来帮助Java进行命令行解析时,需要考虑以下JCommander的其他特征。
- JCommander是开源的,并获得了Apache License 2.0的许可 。
-
jcommander-1.72.jar
大小约为68 KB,没有第三方库编译依赖项。 - JCommander文档提供了将JCommander与Kotlin一起使用以及将JCommander与Groovy 一起使用的示例 。
- JCommander仍然受到TestNG创作者Cedric Beust的积极支持, 其网页反映了其现代/当前的支持。
其他参考
- 指挥官
- Maven存储库上的JCommander
- GitHub上的JCommander源
- JCommander API (Javadoc)
- 使用JCommander的复杂行命令语法
- JCommander –轻松解析命令行参数
- 使用JCommander轻松进行命令行界面编码
- Args4j vs JCommander用于解析命令行参数
- 使用JCommander和Spring的Java命令行标志
- JCommander与args4j
翻译自: https://www.javacodegeeks.com/2017/07/java-command-line-interfaces-part-7-jcommander.html