JOpt Simple的主页将这个基于Java的库称为“用于解析命令行选项的Java库,例如您可能传递给调用javac
的Java库,”该Java库试图“使用POSIX getopt()的命令行选项语法)和GNU getopt_long() 。” 这是我使用Java进行命令行参数处理系列文章的第六篇,其重点是JOpt Simple 。
在本系列的Java命令行处理中,我回顾过的大多数库都以某种方式使用了注释。 像Apache Commons CLI一样 ,JOpt Simple不使用注释。 JOpt Simple改为支持“流畅的界面”。 原始帖子的示例(代码清单)和输出(屏幕快照)基于JOpt Simple 4.9进行编译和运行,但是当我使用JOpt Simple 5.0.3进行编译和运行时,它们对我的工作方式相似(且无需更改代码)。 。
下一个代码清单演示了使用JOpt Simple进行命令行处理的“定义”阶段,该示例有意类似于先前有关Java命令行处理的文章中所使用的示例。
在JOpt Simple中定义命令行选项
final OptionParser optionParser = new OptionParser();
final String[] fileOptions = {"f", "file"};
optionParser.acceptsAll(Arrays.asList(fileOptions), "Path and name of file.").withRequiredArg().required();
final String[] verboseOptions = {"v", "verbose"};
optionParser.acceptsAll(Arrays.asList(verboseOptions), "Verbose logging.");
final String[] helpOptions = {"h", "help"};
optionParser.acceptsAll(Arrays.asList(helpOptions), "Display help/usage information").forHelp();
此代码清单演示了如何使用“流利的API”方法定义命令行选项。 实例化一个OptionParser ,然后为每个潜在的命令行选项调用其重载的acceptsAll方法之一。 使用acceptsAll可以将多个标志/选项名称与单个选项相关联。 对选项同义词的这种支持允许对同一选项使用“ -f”和“ -file”。
上面的代码演示了可以通过.required()
方法调用根据需要指定命令行选项。 在这种情况下,需要一个“文件”。 如果期望将参数与选项/标志关联放置在命令行上,则可以使用withRequiredArg()
方法。 上面的代码清单中的“ help”选项利用forHelp()
方法告诉JOpt Simple,如果与forHelp()
关联的选项位于命令行中,则如果命令行中未包含必需的选项,则不要抛出异常。命令行。 在我的示例中,这可以确保操作员可以使用-h
或--help
来运行应用程序,而无需任何其他必需的选项,并且可以避免引发异常。
“ JOpt简单用法示例”页面提供了有关定义命令行选项时可用的许多不同可能性的重要详细信息,并使用基于JUnit的断言来演示这些用于定义命令行选项的不同策略如何不同地配置所解析的内容。 上面显示的我的代码清单仅显示了可用内容的一小部分。 请注意, OptionParser类的Javadoc注释也包含重要的细节。
如果一个人静态地导入 Arrays.asList并将潜在的命令行选项的名称作为字符串直接传递给该asList(String ...)方法,而不是使用我创建字符串数组的方法,则上面的代码会更加简洁。首先,然后将它们转换为列表。 我在介绍性文章中使用了这种方法,以很清楚地说明正在发生的事情,但是与该文章在GitHub上相关的代码版本可能会更改为使用静态导入方法。
使用JOpt Simple进行命令行处理的“解析”阶段非常简单:
final OptionSet options = optionParser.parse(arguments);
使用JOpt Simple进行“解析”需要调用OptionParser.parse(String…)方法
使用JOpt Simple进行命令行处理的“询问”阶段也很简单,将在下一个代码清单中进行演示。
out.println("Will write to file " + options.valueOf("file") + " and verbosity is set to " + options.has("verbose"));
单行代码演示了询问是由解析调用返回的OptionSet实例上调用便捷方法组成的。 在这种情况下,在OptionSet
上调用的两个演示方法是OptionSet.valueOf(String)和OptionSet.has(String) 。
JOpt Simple还支持自动生成用法/帮助语句。 下一个代码清单演示了如何执行此操作。
optionParser.printHelpOn(out);
刚刚显示的单行代码将OptionParser
实例生成的用法/帮助信息写入通过其printHelpOn(OutputStream)方法提供给它的输出流。
上面显示了应用JOpt Simple所需的最重要的代码,是时候看看使用此代码的简单应用程序的行为了。 以下屏幕快照演示了实际的代码。 第一个屏幕快照演示了未提供所需的“文件”命令行选项时打印的MissingRequiredOptionsException 。
下一个屏幕快照演示了如何在命令行中指定“文件”和“详细”选项。
在下一个屏幕快照中将演示JOpt Simple提供的自动使用/帮助消息。
在选择框架或库来帮助使用Java进行命令行解析时,需要考虑以下Apache Commons CLI的其他特征。
- JOpt Simple是开源的,并根据MIT许可获得许可 。
- 在撰写本文时,JOpt Simple的最新版本是5.0.3和6.0 Alpha 1;而最新版本是5.0.1和6.0。 本文中使用了JOpt Simple 4.9( JOpt Simple更改日志中当前列出的最新版本和Maven依赖示例中当前显示的版本)。
-
jopt-simple-4.9.jar
大小约为65 KB,并且对任何第三方库都没有编译时依赖性。 - JOPT简单的已经或正在使用的几个有影响库和框架。 这些包括Spring框架 (可选的编译依赖性)和JMH (编译依赖性)。
- JOpt Simple Web页面的主页引用了Mark Reinhold的话 :“我想您可能会对我们在开源Java开发工具包中使用jopt-simple库感兴趣。
- JOpt Simple已面世几年,但似乎仍在维护(最新的Maven Central是2016年12月)。
- JOpt Simple不使用注释,而是依靠流畅的API调用。
- JOpt Simple支持命令行选项之间的关系,例如必需的从属选项 。
当其他受欢迎且有用的工具和库使用该库时,通常这是该库有用的积极信号。 JOpt Simple被选为某些此类工具和库的命令行处理库的选择,无疑与JOpt Simple很好。 对于喜欢使用不使用注释的Java命令行处理的用户,JOpt Simple提供了Apache Commons CLI的有用而强大的替代方法。 JOpt Simple提供的功能远远超过本文中显示的功能,而该功能最好通过阅读基于单元测试的“ 浏览JOpt Simple的功能 ” 来发现 。
其他参考
- JOpt简单
- 基于Javadoc的JOpt简单API文档
- Maven上的JOpt Simple
- JOpt简单示例
- JOpt简单与JewelCli
- JOpt简单与JCommander
- JOpt Simple的命令行参数
翻译自: https://www.javacodegeeks.com/2017/07/java-command-line-interfaces-part-6-jopt-simple.html