Java 命令行界面(第 5 部分):JewelCli

位置:首页>文章>详情   分类:Java教程   阅读(91)   2023-12-07 15:34:57

在使用 Apache Commons CLIargs4jjbock 查看了 Java 中的命令行处理 之后命令行 在之前的帖子中,我将注意力转移到使用 JewelCli 来完成 Java 中命令行参数的类似处理。

几个 Java 命令行处理库使用注释来定义命令行选项。到目前为止,本系列文章中涵盖的四个库中的三个使用注释,JewelCli 也是如此。 JewelCli 在我迄今为止介绍的库中是独一无二的,因为它的注释应用于 Java 接口而不是 Java 类或类的构造。下一个代码清单演示了如何在 Java 接口上使用注释来使用 JewelCli 实现命令行解析的“定义”阶段。

JewelCli“定义”用注解接口实现

package examples.dustin.commandline.jewelcli;

import com.lexicalscope.jewel.cli.Option;

/**
 * Interface defining JewelCli-friendly command-line parameters.
 */
public interface MainCommandLine
{
   @Option(shortName="f", description="Name and path of file to be used.")
   String getFile();

   @Option(shortName="v", description="Indicate whether status should be reported verbosely.")
   boolean isVerbose();

   @Option(helpRequest=true, description="Usage details on command-line arguments.")
   boolean getHelp();
}

上面显示的简单界面包含很多与命令行处理相关的内容。这些选项的单连字符短名称通过 shortName 注释类型元素显式指定,并通过“get”方法的名称隐式指定(尽管 longName 注释类型元素是可用于显式指定开关的长名称 [双连字符] 版本)。命令行选项还通过 Option 注释提供了各自的描述。 helpRequest=true 的使用描述了应该使用什么命令行开关来显示使用/帮助信息。在这种情况下,因为注释方法被命名为getHelp(),所以--help开关将显示使用信息。如果我将方法命名为 getDustin() 并用 @Option(helpRequest=true) 对其进行注释,则开关将是 --dustin 以显示用法。

除了与方法名称匹配的开关的长名称之外,JewelCli 在某些情况下还利用了约定优于配置的优势。通过如上所示注释的命令行选项的相应接口方法定义,冗长开关(返回 boolean)是可选的。文件名开关是必需的,因为它对应的 getFile() 方法返回一个 String。如果我想让文件名可选,我可以为 defaultValue 方法上的 @Option 注释提供一个 getFile(),例如 @Option(defaultValue="")

通过使用 JewelCli MainCommandLine 注释注释的接口(在本例中名为 @Option),我们可以使用 JewelCli 进入“解析”阶段。这在 Main 的下一个代码清单中与“询问”阶段一起进行了演示。

使用 JewelCli 的“解析”和“询问”阶段

package examples.dustin.commandline.jewelcli;

import static java.lang.System.out;

import com.lexicalscope.jewel.cli.CliFactory;

/**
 * Demonstrates use of JewelCli for parsing command-line
 * parameters in Java.
 */
public class Main
{
   public static void main(final String[] arguments)
   {
      final MainCommandLine main = CliFactory.parseArguments(MainCommandLine.class, arguments);
      out.println("You specified file '" + main.getFile() + "' with verbosity setting of '" + main.isVerbose() + "'.");
   }
}

刚刚显示的 Main 类有一行“解析”[调用 CliFactory.parseArguments(Class<T>, String...)] 和一行“询问”[访问 JewelCli 上定义的方法的行- 前面显示的带注释的界面]。

以下三个屏幕快照演示了基于 JewelCli 的代码示例的实际运行情况。第一张图片演示了如何使用 --help 查看用法(注意堆栈跟踪包含在输出中)。第二张图片显示了长 (-) 和短 (--) 选项开关的不同组合。第三张图片显示了未提供必需的命令行参数(在本例中为 --file-f)时显示的输出消息和相关堆栈跟踪。

这篇博文中用于演示 JewelCli 应用的两个类的代码清单在 GitHub 上可用

以下是在选择库以帮助在 Java 中进行命令行解析时要考虑的 JewelCli 的一些其他特性。

  • JewelCli 是开源的,并根据 Apache 软件许可,版本 2 获得许可。
  • 当前的 JewelCli (0.8.9) JAR(jewelcli-0.8.9.jar / 2014 年 2 月)大小约为 542 KB。
  • 无需额外的库即可使用 JewelCli。
  • 如上例所示,JewelCli 在“定义”阶段使用 Java 接口上的注释。任何以类似方式注释类“get”方法的尝试都会在运行时导致诸如“IllegalArgumentException:...不是接口”之类的消息。
    • 但是,JewelCli 确实支持基于类/实例的替代方法,其中注释了类上的“set”方法而不是接口上的“get”方法。
  • JewelCli 允许接口从超接口继承,父接口中定义的@Option将在继承接口中得到支持。
  • 接口中注释的方法的返回数据类型提供命令行选项值的类型强制。枚举甚至可以用作返回数据类型,以将可能的命令行选项类型缩小为一组有限的可能性。

JewelCli 易于使用,并且由于其约定优于配置方法,只需很少的代码即可定义、解析和查询命令行参数。我发现注释用于定义可解析命令行选项的接口的推荐方法在美学上也令人愉悦。

其他资源

  • JewelCli
  • GitHub 上的 JewelCli
  • Maven 上的 JewelCli
  • JewelCli使用介绍
  • JewelCli 文档/博客
  • JewelCLI:Java 的简单 CLI 界面
  • JewelCli:备选方案、评论、博客文章和用户
标签: Java教程
地址:https://www.cundage.com/article/jcg-java-command-line-interfaces-part-5-jewelcli.html