尽管我通常使用Groovy编写要从命令行运行的JVM托管脚本,但是有时候我需要解析Java应用程序中的命令行参数,并且有很多库可供Java开发人员用来解析命令行参数。 在本文中,我将介绍这些Java命令行解析库中最著名的一种: Apache Commons CLI 。

我以前曾在Apache Commons CLI上发表过博客 ,但该文章已有八年历史,描述了Apache Commons CLI 1.1 。 自那以后,我在那篇文章中演示的两个类GnuParser和PosixParser被弃用了。 本篇文章中的示例基于Apache Commons CLI 1.4,并使用CLI 1.3中引入的更新的DefaultParser来替代GnuParserPosixParser

Apache Commons CLI文档的“ 简介 ”介绍了Commons CLI如何完成“命令行处理的三个阶段”(“定义”,“解析”和“询问”)。 这三个阶段在Commons CLI中映射到Option和Options类(“定义”), CommandLineParser接口(“ parsing”)和CommandLine类(“询问”)。

对于此处使用Apache Commons CLI构建的示例,预期的命令行参数相对简单。 一个参数是可选的,并且在指定时表示启用了详细输出。 另一个参数是必需的,用于指定虚构应用程序要处理的文件。 可选参数没有与该标志关联的值,并表示为-v--verbose 。 必需的参数后应跟一个值,该值是文件的路径和名称。 该标志是-f--file 。 下一个代码清单演示了如何使用Commons CLI的Option.Builder (由Commons CLI 1.3引入)来构建预期的选项,作为“定义”阶段的一部分。

在“定义阶段”使用Apache Commons CLI Option.Builder示例

/*** "Definition" stage of command-line parsing with Apache Commons CLI.* @return Definition of command-line options.*/
private static Options generateOptions()
{final Option verboseOption = Option.builder("v").required(false).hasArg(false).longOpt(VERBOSE_OPTION).desc("Print status with verbosity.").build();final Option fileOption = Option.builder("f").required().longOpt(FILE_OPTION).hasArg().desc("File to be processed.").build();final Options options = new Options();options.addOption(verboseOption);options.addOption(fileOption);return options;
}

如上例所示,为Apache Commons CLI实现的“ 构建器 ”模式具有构建器模式的优点,例如在一条语句中以完全完成的状态创建Option ,并使用高度可读的构建器方法来设置该实例的各个字段。 我在Apache Commons CLI上的较旧文章演示了如何使用替代的传统构造方法实例化Option实例。

定义了命令行选项之后,该进入“解析”阶段了,下一个代码清单演示了如何通过简单地调用方法CommandLinePaser.parse()来使用Apache Commons CLI进行解析。

使用Commons CLI解析命令行选项

/*** "Parsing" stage of command-line processing demonstrated with* Apache Commons CLI.** @param options Options from "definition" stage.* @param commandLineArguments Command-line arguments provided to application.* @return Instance of CommandLine as parsed from the provided Options and*    command line arguments; may be {@code null} if there is an exception*    encountered while attempting to parse the command line options.*/
private static CommandLine generateCommandLine(final Options options, final String[] commandLineArguments)
{final CommandLineParser cmdLineParser = new DefaultParser();CommandLine commandLine = null;try{commandLine = cmdLineParser.parse(options, commandLineArguments);}catch (ParseException parseException){out.println("ERROR: Unable to parse command-line arguments "+ Arrays.toString(commandLineArguments) + " due to: "+ parseException);}return commandLine;
}

请注意,此代码使用更新版本的Apache Commons CLI实例化DefaultParser进行解析,而不是像旧代码中那样实例化PosxParserGnuParser

定义了命令行对象并解析了命令行之后,就该开始进行查询了。 下一个代码清单展示了Apache Commons CLI对命令行询问的支持。

使用Commons CLI询问命令行

final boolean verbose =commandLine.hasOption(VERBOSE_OPTION);
final String fileName =commandLine.getOptionValue(FILE_OPTION);
out.println("The file '" + fileName + "' was provided and verbosity is set to '" + verbose + "'.");

上面的代码清单演示了如何使用CommandLine.hasOption()来确定是否存在选项的特定标志,而无需考虑是否为该标志提供了值(在我们的示例中, -v / --verbose是适当的)。 同样,代码显示CommandLine.getOptionValue()可用于获取与所提供的命令行标志关联的值(在我们的示例中, -f / --file选项合适)。

下一个屏幕快照演示了简单示例的输出,该示例的代码清单如上所示,它们演示了对上述详细程度和文件路径/位置命令行选项的支持。

当命令行参数不包含必需的命令行参数时,第二个屏幕快照演示了Commons CLI的输出。

对于任何用于构建Java命令行解析的框架,有用的功能是支持使用和帮助信息的能力。 这是通过Commons CLI的HelpFormatter完成的。 下一个代码清单演示了如何使用HelpFormatter来打印帮助和用法信息,并且代码清单后的屏幕快照演示了使用时的帮助和用法外观。

通过Commons CLI获取“用法”和“帮助”详细信息

/*** Generate usage information with Apache Commons CLI.** @param options Instance of Options to be used to prepare*    usage formatter.* @return HelpFormatter instance that can be used to print*    usage information.*/
private static void printUsage(final Options options)
{final HelpFormatter formatter = new HelpFormatter();final String syntax = "Main";out.println("\n=====");out.println("USAGE");out.println("=====");final PrintWriter pw  = new PrintWriter(out);formatter.printUsage(pw, 80, syntax, options);pw.flush();
}/*** Generate help information with Apache Commons CLI.** @param options Instance of Options to be used to prepare*    help formatter.* @return HelpFormatter instance that can be used to print*    help information.*/
private static void printHelp(final Options options)
{final HelpFormatter formatter = new HelpFormatter();final String syntax = "Main";final String usageHeader = "Example of Using Apache Commons CLI";final String usageFooter = "See http://marxsoftware.blogspot.com/ for further details.";out.println("\n====");out.println("HELP");out.println("====");formatter.printHelp(syntax, usageHeader, options, usageFooter);
}

这篇文章演示了如何使用Apache Commons CLI实现与Java应用程序中的命令行解析有关的一些最常见功能,包括选项“定义”,命令行参数“解析”,解析后的命令行参数“查询”,以及与命令行参数相关的帮助/使用详细信息。 在选择框架或库来帮助使用Java进行命令行解析时,需要考虑以下Apache Commons CLI的其他特征。

  • Apache Commons CLI是开源的,并获得了Apache License 2.0版的许可 。
  • 当前版本的Apache Commons CLI( 1.4 )需要J2SE 5或更高版本。
  • Apache Commons CLI不需要单独下载或引用任何第三方库 。
  • Apache Commons CLI 1.4主JAR( commons-cli-1.4.jar )的大小约为53 MB。
  • Apache Groovy通过CliBuilder基于Apache Commons CLI提供了现成的命令行解析功能。
  • Maven资源库显示了对Apache Commons CLI(包括Apache Groovy)的 近1800种依赖 。
  • Apache Commons CLI已经存在了一段时间。 它最初的1.0版本是在2002年11月。

对我来说,在简单Java应用程序中实现命令行界面时,Apache Commons CLI的最大优势之一就是我已经熟悉Groovy内置的CliBuilder用法 。 因为与基于Java的脚本相比,我更经常将Groovy用于基于命令行的简单脚本和工具,所以对Groovy熟悉基本的Apache Commons CLI用法对返回Java很有帮助。

其他参考

  • Apache Commons CLI
  • Apache Commons CLI简介
  • Apache Commons CLI使用场景
  • Apache Commons CLI API文档
  • 使用Apache Commons CLI进行命令行解析 (我2008年在Apache Commons CLI上的帖子)

翻译自: https://www.javacodegeeks.com/2017/06/java-command-line-interfaces-part-1-apache-commons-cli.html

Java命令行界面(第1部分):Apache Commons CLI相关推荐

  1. 使用 Apache Commons CLI 开发命令行工具

    http://www.ibm.com/developerworks/cn/java/j-lo-commonscli/index.html 使用 Apache Commons CLI 开发命令行工具 杨 ...

  2. flink报错org.apache.commons.cli.Option.builder

    问题复现: yarn-session.sh 完整报错如下: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found bindi ...

  3. 使用 Apache Commons CLI 解析命令行参数示例

    很好的输入参数解析方法 ,转载记录下 转载在: https://www.cnblogs.com/onmyway20xx/p/7346709.html Apache Commons CLI 简介 Apa ...

  4. Java之加密工具类java.security.MessageDigest或org.apache.commons.codec.digest.DigestUtils

    Java之加密(信息摘要)工具类(依赖:java.security.MessageDigest或org.apache.commons.codec.digest.DigestUtils) 1. java ...

  5. Caused by: org.apache.commons.cli.MissingArgumentException: Missing argument f/h/s/v......

    今日在做一个基于Command CLI通过命令行控制参数的小模块,在输入-f参数后,报出这个错误: Caused by: org.apache.commons.cli.MissingArgumentE ...

  6. java lambda使用_在Java 8 Lambda上使用Apache Commons Functor功能接口

    java lambda使用 Apache Commons Functor (以下称为[functor])是一个Apache Commons组件,它提供功能性的编程API和已实现的几种模式(访问者,生成 ...

  7. 在Java 8 Lambda上使用Apache Commons Functor功能接口

    Apache Commons Functor (以下称为[functor])是一个Apache Commons组件,它提供功能性的编程API和已实现的几种模式(访问者,生成器,聚合器等). Java ...

  8. Java 文件上传组件 Apache Commons FileUpload 应用指南(二)——FileUpload如何工作?

    在最初的 http 协议中,没有上传文件方面的功能.RFC1867("Form-based File Upload in HTML".) 为 http 协议添加了这个功能.客户端的 ...

  9. Rejecting re-init on previously-failed class java.lang.Class<org.apache.commons.httpclient.HttpClien

    Rejecting re-init on previously-failed class java.lang.Class<org.apache.commons.httpclient.HttpCl ...

最新文章

  1. python类方法调用装饰_Python3 @classmethod 函数装饰器 声明一个类方法
  2. 对URLEncode的解码
  3. Mission系统预览
  4. MYSQL 获取每个汉字的拼音首字母
  5. android sd卡 格式化 rom,Android开发之获取SD卡及手机ROM容量的方法
  6. 信息学奥赛C++语言:乘车费用
  7. 小说小程序源码 带采集
  8. Spring Boot系列教程六:日志输出配置log4j2
  9. 如何根据变量类型选择数据分析方法
  10. 【DL小结3】RNN与LSTM
  11. LLVM与Clang的概述及关系
  12. Docker-删除untagged docker images
  13. Android 启动问题——黑屏 死机 解决方法
  14. txt unicode 前加 0xFF 0xFE
  15. 我的第一本社会心理学(part1)--社会心理学是研究个体和群体的社会心理、社会行为及其发展规律的科学
  16. Linux操作学习笔记(CentOS7)
  17. FileDownloader 库推荐
  18. 如何用光盘自动安装win7操作系统
  19. 计算机实践学什么作用,大学计算机基础:计算机操作实践
  20. 炎炎夏日,深夜详谈nginx的配置中location和rewrite的语法规则(从入门到高手的第六步)

热门文章

  1. 面试官让我讲讲Java中的锁,我笑了
  2. JS的Date.setMonth()方法坑
  3. Java中的List你真的会用吗
  4. 浅谈流处理算法 (1) – 蓄水池采样
  5. jQuery 基础教程 (一)之jQuery的由来及简介
  6. 使用cardme读写VCard文件,实现批量导入导出电话簿
  7. ConcurrentHashMap的红黑树实现分析
  8. 最全三大框架整合(使用映射)——DeptServiceImpl.java
  9. python股票自动买卖视频教程_十分钟学会用Python交易股票
  10. 机器学习(周志华)- 第2章模型评估与选择笔记