Java 命令行接口(第 2 部分):args4j

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(285)   2023-12-06 07:14:57

在我的上一篇文章中,我研究了使用 Apache Commons CLI 解析 Java 应用程序中的命令行参数。在这篇文章中,我着眼于使用不同的库执行相同的操作:args4j

args4j 采用与 Commons CLI 使用的方法不同的方法来指定 Java 应用程序应该期望哪些命令行参数。虽然 Commons CLI 期望表示选项的对象被单独和显式实例化,但 args4j 使用自定义注释来促进命令行参数处理的这个“定义”阶段。命令行选项应该是类中的实例级字段,并使用 @org.kohsuke.args4j.Option 注释进行注释。每个命令行参数的特征都作为此 @Option 注释的属性包含在内。

这篇文章中演示的简单应用程序与我之前的文章中使用的应用程序类似,重点关注用于指定详细程度的可选且无价值的 -v 选项和一个需要的 -f 选项表示文件路径和名称的值。下一个代码清单演示了如何使用 args4j 的 @Option 注释将这些命令行参数设置为类数据成员的注释。

args4j 通过@Option 注解定义命令行参数

@Option(name="-v", aliases="--verbose", usage="Print verbose status.")
private boolean verbose;

@Option(name="-f", aliases="--file", usage="Fully qualified path and name of file.", required=true)
private String fileName;

如上面的代码清单所示,很容易指定选项的名称、用途以及是否需要(默认为可选)。上面 private 修饰符的存在使得这些是在类级别定义的属性很明显。因为没有static修饰符,我们看到这些都是被注解过的实例变量。

要解析命令行选项,只需实例化一个 CmdLineParser 并将命令行参数传递给它的 parseArguments(String ...) 方法:

在 args4j 中解析命令行参数

final CmdLineParser parser = new CmdLineParser(this);
try
{
   parser.parseArgument(arguments);
}
catch (CmdLineException clEx)
{
   out.println("ERROR: Unable to parse command-line options: " + clEx);
}

在刚刚显示的 Java 代码的第一行中,this 是对类实例的引用,上面显示的成员变量在其中定义并使用 @Option 注释进行注释。在本例中,我使用了 this,因为定义这些选项的类是调用此解析方法的类。要在同一个类中执行此操作,我需要在类中定义一个名为 static 的实例(非 doMain)方法,并由类的 main< 调用/code> 函数(这在本文末尾的完整代码清单中显示)。从类的 $ 函数接收的命令行参数是传递给 main(final String[]) 方法的字符串数组。

接下来的两个屏幕快照演示了基于 args4j 的所述代码在解析命令行参数时的应用。第一张图片显示了两个选项的空头和多头选项的组合。第二张图片显示了未提供所需命令行参数的情况的自动报告。

命令行解析库的一个重要特性是能够显示用法或帮助信息。下一个代码清单演示了使用 args4j 的 CmdLineParser.printUsage(OutputStream) 方法执行此操作的示例。

使用 args4j 打印使用信息

final CmdLineParser parser = new CmdLineParser(this);
if (arguments.length < 1)
{
   parser.printUsage(out);
   System.exit(-1);
}

args4j 默认打印出的使用信息在下一个屏幕快照中描述。

这篇文章演示了使用 arg4j 实现一些与 Java 应用程序中的命令行解析相关的最常见功能,包括选项“定义”、命令行参数“解析”、已解析命令行参数的“询问”以及帮助/ 与命令行参数相关的用法详细信息。现在显示上面代码清单中部分表示的类的完整代码清单。

args4j 演示的完整代码清单 Main.java

package examples.dustin.commandline.args4j;

import static java.lang.System.out;

import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;

import java.io.IOException;

/**
 * Demonstrate args4j.
 */
public class Main
{
   @Option(name="-v", aliases="--verbose", usage="Print verbose status.")
   private boolean verbose;

   @Option(name="-f", aliases="--file", usage="Fully qualified path and name of file.", required=true)
   private String fileName;

   private void doMain(final String[] arguments) throws IOException
   {
      final CmdLineParser parser = new CmdLineParser(this);
      if (arguments.length < 1)
      {
         parser.printUsage(out);
         System.exit(-1);
      }
      try
      {
         parser.parseArgument(arguments);
      }
      catch (CmdLineException clEx)
      {
         out.println("ERROR: Unable to parse command-line options: " + clEx);
      }
      out.println("The file '" + fileName + "' was provided and verbosity is set to '" + verbose + "'.");
   }

   /**
    * Executable function demonstrating Args4j command-line processing.
    *
    * @param arguments Command-line arguments to be processed with Args4j.
    */
   public static void main(final String[] arguments)
   {
      final Main instance = new Main();
      try
      {
         instance.doMain(arguments);
      }
      catch (IOException ioEx)
      {
         out.println("ERROR: I/O Exception encountered: " + ioEx);
      }
   }
}

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

  • args4j 是开源的,并已获得 MIT 许可证 许可。
  • args4j 的当前版本 (2.33) 需要 J2SE 5
  • args4j 不需要单独下载或引用任何第三方库。
  • args4j 2.33 主 JAR (args4j-2.33.jar) 的大小约为 152 KB。
  • Maven 存储库显示对 args4j 的 376 个依赖项,包括 OpenJDK 的 JMH CoreJenkins(考虑到 Kohsuke Kawaguchi 参与两者)。
  • args4j 已经存在了一段时间;它的 2.0.3 版本是在 2006 年 1 月发布的,至少从 2003 年就已经以某种形式出现了。
  • args4j 允许通过 @Option 注释上的“hidden”从使用输出中排除命令行参数。
  • args4j 允许指定和强制执行命令行参数之间的关系。这包括指定何时不能同时提供两个参数的能力(“forbids“),以及何时只有在还提供另一个参数时一个参数的存在才有意义(“depends “)。
  • args4j 支持在有限值集适用于选项的情况下使用枚举类型的类属性。 @Option 文档在“枚举开关”部分描述了如何执行此操作。
  • args4j 通过其 OptionHandler 类提供命令行参数解析的可扩展性和可定制性。

args4j 库易于使用并允许高度可读的代码。在决定是否使用 args4j 时,最大的考虑因素可能是决定使用注释指定命令行参数定义的舒适程度。

其他参考资料

  • args4j
  • args4j下载
  • args4j 源代码 (GitHub)
  • args4j API 文档
  • args4j 主要示例
标签2: Java教程
地址:https://www.cundage.com/article/jcg-java-command-line-interfaces-part-2-args4j.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...