• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Java命令行界面(第8部分):Argparse4j

java 来源:dnc8371 14次浏览

Argparse4j是“ Java命令行参数解析器库”,其主页描述为“基于Python的argparse模块的Java命令行参数解析器库”。 在本文中,我将简要介绍如何使用Argparse4j 0.7.0处理命令行参数,该参数与本系列中的前七篇有关Java命令行处理的文章中所解析的相似。

可以通过ArgumentParser接口及其addArgument(String …)方法完成使用Argparse4j进行命令行处理的参数“定义”阶段addArgument(String...)方法的返回类型是Argument接口的实例。 该接口的实现(通常是ArgumentImpl )提供了用于设置每个参数的特征的方法。 因为这些方法中的每一个都返回一个Argument实例,所以这些调用可以以非常流畅的方式链接在一起。 下一个屏幕快照对此进行了演示。

Argparse4j的“定义”阶段

final ArgumentParser argumentParser =
   ArgumentParsers.newArgumentParser("Main", true);
argumentParser.addArgument("-f", "--file")
              .dest("file")
              .required(true)
              .help("Path and name of file");
argumentParser.addArgument("-v", "--verbose")
              .dest("verbose")
              .type(Boolean.class)
              .nargs("?")
              .setConst(true)
              .help("Enable verbose output.");

在上面的代码清单中,使用静态初始化方法实例化了ArgumentParser实例,该实例需要一个String参数来表示使用或帮助输出中将包含的脚本或程序名称ArgumentParsersnewArgumentParse(String,boolean)方法的第二个参数指定将自动支持“帮助”选项 -h--help

上面的代码清单中定义的第一个参数允许在命令行上指定文件路径和名称。 字符串“ -f”和“ -file”被传递到addArgument(String...)方法,这意味着-f--file可以在命令行上用于指定文件路径和名称。 在作为第一个参数的说明的一部分而创建的Argument实例上,调用了另外三个方法[ dest(String)required(boolean)help(String) ]。 这三个方法分别指定一个名称,可以在代码中引用该参数,该参数必须出现在命令行中,以及在请求该参数的帮助时要显示的字符串。

上面的代码清单中定义的第二个参数将字符串“ -v”和“ -verbose”传递给addArgument(String...)方法,以允许该参数在命令行上使用短选项或长选项名表示。 。 像第一个参数一样,该名称的名称将由dest(String)方法设置的代码中引用,并使用help(String)方法为“ help”输出指定其字符串。 第二个参数不是必需的,因此这里required(boolean)方法。

第二个参数的定义在Argument上有一些其他方法称为。 我使用type(Class <T>)演示了显式指定参数所需的Java数据类型的功能。 我还需要指定nargs(String)setConst(Object)方法的组合,以指定verbosity参数不需要该标志提供的值。 这使我可以在期望明确说明的那些选项之后指定-v--verbose ,而没有“ true”或“ false”。

argparse4j通过调用ArgumentParserparseArgs(String [])方法来支持命令行处理的“解析”阶段。 下一个代码清单演示了这一点。

使用Argparse4j“解析”命令行参数

final Namespace response = argumentParser.parseArgs(arguments);

解析仅需要一个语句,并返回Namespace的实例。

使用Argparse4j进行命令行处理的“询问”阶段涉及从Namespace实例包装的Map中访问已解析的命令行参数。 该映射的键是使用dest(String)方法指定的字符串,并且映射的值是与那些参数名称关联的值。 在下一个代码清单中将演示如何查询这些值。

用Argparse4j“询问”命令行参数

final String filePathAndName = response.getString("file");
final Boolean verbositySet = response.getBoolean("verbose");

out.println(
     "Path/name of file is '" + filePathAndName
   + "' and verbosity is "
   + (Boolean.TRUE.equals(verbositySet) ? "SET" : "NOT SET")
   + ".");

在刚刚列出的代码中,使用了“文件”和“详细”键,因为在定义预期参数时, dest(String)方法提供了相同的字符串。

可以从GitHub上看到提取上述代码段的完整源代码。

下一个屏幕快照演示了不带任何参数的简单Java应用程序的运行以及显示的有关缺少的必需“文件”参数的消息。

上面的屏幕快照中显示的所有大写“ FILE”来自在定义预期参数时在dest(String)方法中指定的dest(String) 。 换句话说,该dest(String)规范既设置了用于在内部键入参数映射的字符串,又设置了显示在帮助/用法中的目标字符串。

下一个屏幕快照展示了“文件”和“详细”选项的典型用法的几种变体。

最终的屏幕快照演示了为-h--help选项提供的帮助信息,因为ArgumentParser的原始实例是使用“ addHelp”参数设置为true

在选择框架或库来帮助Java进行命令行分析时,需要考虑Argparse4j的一些其他特征。

  • Argparse4j是开放源代码,并已获得MIT许可证
  • argparse4j-0.7.0.jar (2015年12月)的大小约为89 KB,并且没有其他第三方库依赖项。
  • Argparse4j不使用注释。
  • 联机文档包含Clojure示例
  • 我怀疑使用Python(特别是如果使用argparse )编写脚本的Java开发人员在需要解析命令行参数的Java应用程序中使用argparse4j时会获得好处。
    • (我发现在Java中处理命令行参数时, Apache Commons CLI很直观,因为与Java中相比,我在Groovy中解析命令行参数的频率更高,并且Groovy提供了内置的Apache Commons CLI支持)
  • Argparse4j启发了 Scala的argparse4s 的开发

Argparse4j只是许多基于Java的命令行处理库之一。 argparse4j的独特之处在于它的argparse传统,这使它与众多其他选择大相径庭。 鉴于此,我相信最可能选择Argparse4j来满足其Java命令行处理需求的Java开发人员将是那些经常使用argparse在基于Python的脚本和工具中解析命令行参数的开发人员,或者更喜欢Python和argparse的命令解析语义的那些开发人员。 。

其他参考

翻译自: https://www.javacodegeeks.com/2017/07/java-command-line-interfaces-part-8-argparse4j.html


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)