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

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(226)   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:备选方案、评论、博客文章和用户
标签2: Java教程
地址:https://www.cundage.com/article/jcg-java-command-line-interfaces-part-5-jewelcli.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...