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

位置:首页>文章>详情   分类:Java教程   阅读(108)   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 主要示例
标签: Java教程
地址:https://www.cundage.com/article/jcg-java-command-line-interfaces-part-2-args4j.html