google-optionsGitHub页面指出google-options是“来自Google(java)的人们的命令行参数解析库。” 该页面继续说:“这是Bazel Project中的命令行参数解析器。 com.google.devtools.common.options程序包已拆分为一个单独的jar,用于通用工具。” 这篇博客文章演示了如何将google-options应用于处理Java代码中的命令行选项。

这篇文章中用于演示google-options的示例与本系列前面的13篇文章中有关处理Java命令行选项的示例相似。 本示例支持两个选项:一个必需的文件路径/名称选项,该选项要求带有该路径和名称的String参数,以及一个不带参数的详细选项(它的存在启用了详细性)。 这篇文章只会显示代码中最相关的部分,但是完整的代码可以在GitHub上找到

基于Java的命令行处理的“定义”阶段是通过自定义类在google-options中完成的,该类扩展了google-options的com.google.devtools.common.options.OptionsBase类。 自定义类应提供与预期的命令行选项相对应的public字段,并且每个public字段都应使用@Option注释进行注释@Option批注需要两个元素( namedefaultValue ),并允许使用诸如helpabbrev的可选元素。 在自定义Options类的下一个代码清单中提供了此“定义”阶段的示例。

带有google-options的“定义”阶段:自定义

/**
 * Represents command-line options to be processed via
 * google-options library. Fields must be annotated with
 * @Option and must be public.
 */
public class Options extends OptionsBase
{
   @Option(name="file",
           abbrev='f',
           help="Path and name of file",
           category="Startup",
           defaultValue="")
   public String filePathAndName;

   @Option(name="verbose",
           abbrev='v',
           help="Enable verbose output",
           category="Startup",
           defaultValue="false")
   public boolean verbose;
}

@Option批注的必需“ name”元素指定“ long”选项名称,而可选的“ abbrev”元素指定“ short”(单个字符)选项名称。 @Option注释的可选“ help”元素允许为选项提供“帮助”字符串,而必需的“ defaultValue”元素指定未明确指定选项时要使用的选项的默认值。

在Google-options中,“解析”阶段是通过实例化与使用Option注释的public字段与自定义类相关联的OptionsParser实例,然后在该OptionsParser实例上调用“ parse”方法来完成的。 下一个代码清单通过调用OptionsParser.parseAndExitUponError(String [])方法演示了这一点。

带有Google选项的“解析”阶段

final OptionsParser optionsParser = OptionsParser.newOptionsParser(Options.class);
optionsParser.parseAndExitUponError(arguments);

带有google-options的“审讯”阶段就像访问自定义类上带Option注释的public字段一样简单,如下面的代码清单所示。

谷歌选项的“审讯”阶段

out.println(
     "Path/file name is '" + options.filePathAndName
   + "' and verbosity is '" + options.verbose + "'.");

下一个代码清单演示了如何使用OptionsParser方法describeOptions显示帮助详细信息。

使用google-options的“帮助”

private static void printUsage(OptionsParser parser)
{
   out.println("Usage: java Main <Options>");
   out.println(parser.describeOptions(Collections.emptyMap(),
   OptionsParser.HelpVerbosity.LONG));
}

以下屏幕快照演示了以上代码清单。 第一个图像描述了没有提供参数时提供的“帮助”信息,第二个图像描述了以各种长短形式表示的两个主要命令行选项。 从第二张图片可以看出,有趣的是google-options自动为boolean选项支持--noversion选项,显式指定了没有冗长性。

屏幕快照还显示google-options对Guava有依赖性。

这是在选择框架或库以帮助使用Java进行命令行解析时要考虑的google选项的特征。

  • google-options是使用Apache License 2.0许可的开源库。
  • google-options-1.0.0.jar的大小约为72 KB。
  • 使用google-options的应用程序还需要在运行时类路径上包括Guava,因为google-options依赖于Guava。 无论如何,对于使用Guava的应用程序来说,这并不是什么大问题。 但是,对于尚未使用Guava的小型应用程序,这可能比应用程序作者希望为基于命令行的简单应用程序所具有的依赖性更大。

本系列中介绍的几个基于Java的命令行处理库都使用批注定义了期望的选项,这就是google-options使用的方法。 使用google-options进行命令行选项的基本处理是一个相对简单的过程,但是对于不依赖Guava的简单应用程序来说,新的Guava依赖项的成本可能太高了。

其他参考

翻译自: https://www.javacodegeeks.com/2017/09/java-command-line-interfaces-part-14-google-options.html

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐