Java 命令行界面(第 14 部分):google-options

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(583)   2024-01-26 16:34:57

google-options 的 GitHub 页面指出 google-options 是“来自 Google (java) 人员的命令行参数解析库”。该页面继续说,“这是来自 Bazel 项目 的命令行参数解析器。 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)并允许可选元素,例如 help缩写。自定义 Options 类的下一个代码清单中提供了此“定义”阶段的示例。

带有 google-options 的“定义”阶段:自定义 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”元素指定“长”选项名称,而可选的“abbrev”元素指定“短”(单个字符)选项名称。 @Option 注释的可选“help”元素允许为选项提供“help”字符串,而必需的“defaultValue”元素指定选项的默认值。没有明确规定。

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

带有 google-options 的“解析”阶段

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

使用 google-options 的“询问”阶段就像访问自定义类上带注释的 Option 字段一样简单,如下一个代码清单所示。

带有 google-options 的“审讯”阶段

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 自动支持 --noversion 选项,用于明确指定不冗长的 boolean 选项。

屏幕快照还表明 google-options 依赖于 Guava

以下是在选择框架或库以帮助在 Java 中进行命令行解析时要考虑的 google-options 特征。

  • 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 依赖项的成本可能太高了。

其他参考资料

  • google-options GitHub 页面
  • google-options Javadoc API 文档
  • Maven 存储库上的 google-options 1.0.0
标签2: Java教程
地址:https://www.cundage.com/article/jcg-java-command-line-interfaces-part-14-google-options.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...