picocli主页面将picocli描述为“强大的微小命令行界面”,“ picocli”是一个文件Java框架,用于解析命令行参数并生成精美,易于定制的用法帮助消息。 有颜色。” 这篇文章简要介绍了如何使用Picocli 0.9.7处理Java代码中的命令行参数。
像本系列中介绍的其他基于Java的命令行处理库一样, picolci是开源的 。 由于picocli的所有实现都存在于单个Java源代码文件中 ,因此如果需要,可以直接直接使用源代码。 picocli页面强调了这一点,“ picocli的一个显着特征是它旨在让用户运行基于picocli的应用程序而无需将picocli作为外部依赖项:所有源代码都保存在单个文件中,以鼓励应用程序作者将其包含在其中。源表格 。” 如果您希望将picocli用作库,则Maven信息库中提供了一个JAR,其中包含大量已编译的.class
文件(Picocli具有一个Java文件,但具有许多嵌套的类和注释)。
了解Picocli单文件性质的最简单方法是查看该单文件本身。 在Picocli的“下载”页面上可以找到CommandLine.java的Java源代码。 接下来的两个屏幕快照显示了当对CommandLine
类执行时,对一个内部注释和一个内部类执行时, javap的一些输出。
无论是将CommandLine.java
编译到自己的类/ JAR文件中还是选择使用Maven中的预构建JAR,使用Picocli的应用程序的源代码显然都是相同的。 通过注释实例字段来完成Picocli的“定义”阶段,该实例字段将存储与命令行选项关联的值。 下面的代码段对此进行了演示。
Picocli的“定义”阶段
/*** Demonstrate Java-based command-line processing with picocli.*/
@Command(name="Main",description="Demonstrating picocli",headerHeading="Demonstration Usage:%n%n")
public class Main
{@Option(names={"-v", "--verbose"}, description="Verbose output?")private boolean verbose;@Option(names={"-f", "--file"}, description="Path and name of file", required=true)private String fileName;@Option(names={"-h", "--help"}, description="Display help/usage.", help=true)boolean help;
刚刚显示的代码示例演示了Picocli允许指定选项标志的多个名称(在我的示例中,我指定了单连字符单字符名称和双连字符多字符名称)。 该例子也说明required=true
能为所需的选项,指定help=true
支持特别可以“帮助”选项来指定具体的帮助,行为,比如打印使用细节,避免与缺乏所需的选项错误。 请注意,Picocli 0.9.8通过versionHelp
和usageHelp
添加了更多特定的帮助类型支持。
“解析”阶段是在Picocli中使用CommandLine.populateCommand(T,String ...)完成的 ,其中T
是带有Picocli批注字段的类的实例,其余String
是要解析的参数。 下一个代码片段对此进行了演示。
Picocli的“解析”阶段
final Main main = CommandLine.populateCommand(new Main(), arguments);
使用Picocli进行“询问”阶段仅需访问在“分析”阶段中传递给CommandLine.populateCommand(T,String...)
方法的实例的Picocli注释字段。 下一个代码清单中描述了这种“询问”的简单示例。
皮科克里的“审讯”阶段
out.println("The provided file path and name is " + main.fileName+ " and verbosity is set to " + main.verbose);
要在命令行上提供-h
或--help
时向用户显示帮助/使用信息,就像“询问”指定为help=true
的Picocli注释字段一样简单,以查看是否设置了该布尔值并且,如果已设置,则调用重载的CommandLine.usage方法之一。 我碰巧使用了此方法的static
版本之一,如下面的代码清单所示。
Picocli的帮助/使用
if (main.help)
{CommandLine.usage(main, out, CommandLine.Help.Ansi.AUTO);
}
接下来的几个屏幕快照演示了实际的基于Picocli的简单处理应用程序。 第一个图像显示了错误消息的类型和堆栈跟踪,当不存在必需的标志时,将显示堆栈跟踪。 第二张图片显示了如何在注释中指定我使用的长名和短名。 第三张图片显示了正在使用的帮助功能。
许多其他基于Java的命令行解析库所不具备的Picocli可选功能之一是颜色语法支持 。 这篇文章中的第一个代码清单显示了一些用@| |@
注释定义的字符串@| |@
@| |@
语法。 在上面显示“帮助”用法的屏幕快照中,这些字符按原样传递,没有特殊处理。 但是,如果我改为在Cygwin中运行此示例代码,我将看到这些标记的作用。
从上面的屏幕快照中,我们看到Picocli自动将某些颜色语法(黄色和白色)应用于各个选项的帮助,并且还将定制的粗体和带下划线的粗体语法应用于描述@| |@
区域@| |@
@| |@
语法已应用。
在选择框架或库来帮助使用Java进行命令行解析时,需要考虑Picocli的一些其他特征。
- Picocli是开源的,并根据Apache License 2.0获得许可 。
- Picocli不需要下载任何第三方库或框架。
- Picocli源代码完全包含在一个
.java
文件中,并且该源代码可以复制并粘贴到自己的配置管理系统中,并与其余应用程序代码一起构建,这意味着甚至Picocli JAR文件也并非绝对必要。
- Picocli源代码完全包含在一个
-
CommandLine.java
源代码文件(Picocli 0.9.7)不到3700行(包括空白和注释),大小几乎为200 KB。picocli-0.9.7.jar
文件的大小约为83 KB。 - Picocli得到当前和经常的支持。 它的0.9.8版本已于昨天发布(在我撰写了这篇文章的大部分内容之后)。
- 与其他几个基于Java的命令行处理库的文档相比, Picocli文档更加详细,并且在许多方面更具现代感。
- Picocli对颜色语法的支持易于使用,并且在不同平台上对颜色语法的支持已在文档的“ 支持的平台 ”部分下进行了说明。
- Picocli在实例级字段上使用批注的方式与某些其他基于Java的命令行处理库类似,并且具有相同的优势。
- Picocli的基本功能非常易于访问且易于快速学习,但是Picocli还支持使用Picocli显着自定义命令行处理的多个方面的功能。
Picocli是当前支持和更新的库,用于处理Java的命令行参数。 它具有其他一些可用的基于Java的命令行处理库的一些较新的功能和方法,并引入了几个不同的功能(颜色语法和整个库封装在单个Java源文件中)。 Picocli易于使用并具有吸引力,但是如果特定的开发人员希望获得颜色语法支持或将源代码文件拖放到开发人员项目中的能力,则该开发人员很可能会将其与其他开发人员分开需要一个JAR或已编译的.class
文件。
其他参考
- Picocli主页
- Picocli发布
- Picocli的单个源文件: CommandLine.java
- Maven上的Picocli
- GitHub上的Picocli
- Picocli API文档 (Javadoc)
翻译自: https://www.javacodegeeks.com/2017/08/java-command-line-interfaces-part-10-picocli.html