Jargo在其GitHub主页上定义为“一种减轻程序参数/选项处理的工具”。 当已经存在许多其他命令行处理库时,该页面为另一个命令行处理库提供了基本原理 ,该列表的顶部是“因为类型安全性,不变性和可读性很重要”。
Jargo的选项“定义”阶段使用Argument类的通用类型的实例。 这些Argument
实例是通过Arguments类上的静态方法创建的,以建立类型,然后使用生成器样式的方法来描述选项。 在下一个屏幕快照中对此进行了演示,该快照描述了文件路径/名称和详细程度的选项定义(完整的代码清单可在GitHub上找到 )。
Jargo的“定义”舞台
final Argument<String> filePathAndName= stringArgument().description("Path and name of file.").names("--file", "-f").required().build();
// Use optionArgument() instead of booleanArgument() to avoid need
// to specify true or false as arguments to --verbose/-v option
final Argument<Boolean> verbose= optionArgument("--verbose", "-v").description("Enables verbosity.").names("--verbose", "-v").defaultValue(false).build();
上面显示的stringArgument()
和optionArgument()
方法在静态导入(未显示)的Arguments
类上调用。 需要将optionArgument()
方法用于详细程度标志,以避免要求在详细程度标志后显式声明为true
或false
。
“解析”阶段是使用CommandLineParser类及其流利的API方法实现的,如下面的代码清单所示。
final ParsedArguments parsedArguments= CommandLineParser.withArguments(filePathAndName, verbose).parse(arguments);
CommandLineParser
提供的ParsedArguments实例可用于“询问”阶段。 这是通过在ParsedArguments
实例上调用“ get”方法并将适当的Argument
实例传递给它来完成的。 下一个代码清单演示了这一点。
Jargo的“审讯”阶段
out.println("File path/name is '" + parsedArguments.get(filePathAndName)+ "' and verbosity is set to '" + parsedArguments.get(verbose) + "'.");
以下屏幕快照描述了Jargo的用法。 第一个屏幕快照演示了未指定必需选项时发生的异常堆栈跟踪,第二个屏幕快照演示了正在使用的长和短选项名称。
第一个屏幕快照中显示的堆栈跟踪不是通知用户未指定必需选项的最佳方法。 Jargo通过捕获ArgumentException并调用其getMessageAndUsage()
方法来允许返回更好的消息。 可以在GitHub上看到此代码,结果显示在下一个屏幕快照中。
屏幕快照表明已显示在Argument
的实例中提供的信息。 Jargo还允许在指定“ help”参数时显式引发异常以提供此信息。 这利用了Arguments
类上的静态方法helpArgument()
,其用法示例包含在GitHub代码清单中 。
选择框架或库来帮助使用Java进行命令行解析时,Jargo的特性应予以考虑。
- Jargo是开源的,并根据Apache License 2.0版获得许可 。
- Jargo的jargo-0.4.1.jar大小约为177 KB,但它对更大的Guava库具有运行时依赖性。
- 严格来说,对Guava的依赖是一个故意的决定,如Jargo的基本原理所述 :“因为我爱Guava,并希望将一个参数解析库与之很好地集成在一起(该部门将提供更多信息)。”
- Jargo使用强类型的API调用以编程方式配置预期的命令行选项,而不是使用批注和/或反射。
- 在拥有如此多基于Java的命令行处理库的领域中,对于希望使用Jargo的Rationale列出的命令行处理库的所有属性来解释为什么另一个库的开发人员来说,Jargo最有可能成为重要的竞争者。这个拥挤的空间得以开发。
Jargo是一个易于使用的库,用于处理Java中的命令行选项,并利用通用类型的类和特定于类型的静态方法来增强命令行选项的类型安全性。 Jargo需要Guava才能运行,因此最适合已在使用Guava的应用程序。 如果Jargo基本原理中的所有项目对于该开发人员都很重要,则开发人员可能会认真考虑Jargo而不是其他基于Java的替代命令行处理库。
其他参考
- Jargo (GitHub)
- Maven上的Jargo ( Maven存储库 )
翻译自: https://www.javacodegeeks.com/2017/09/java-command-line-interfaces-part-15-jargo.html