我的 Java 命令行解析系列文章的第四部分介绍了 Commandline,它被描述为“一个用于解析命令行参数的 Java 库”,它“基于通过使用注释将命令行参数映射到对象。”
与之前介绍的 args4j 和 jbock 一样,Commandline 使用注释来提供潜在命令行选项的“定义”。然而,虽然 args4j 通过类字段上的注释来实现这一点,而 jbock 通过构造函数及其参数上的注释来实现这一点,但 Commandline 在“set”(mutator)方法上使用注释。在这篇文章中,我使用了一个 Main
类示例,就像之前关于基于 Java 的命令行处理的文章中一样,但在正常情况下,我通常更喜欢用一个特殊的类来表示命令行争论。
下面的代码清单演示了在“get”方法上使用命令行注释来实现 Commandline 命令行处理的“定义”阶段。
命令行处理的命令行“定义”阶段
public class Main { /** Is verbosity enabled? */ private boolean verbose; /** Name/path of applicable file. */ private String fileName; @Option @ShortSwitch("v") @LongSwitch("verbose") @Toggle(true) public void setVerbose(final boolean newVerbose) { verbose = newVerbose; } @Option @ShortSwitch("f") @LongSwitch("file") @SingleArgument @Required public void setFileName(final String newFileName) { fileName = newFileName; }
上面的代码清单显示了命令行注释 @Option
的使用以及其他自定义定义选项的注释(@ShortSwitch
和 @LongSwitch
用于短参数和长参数, @Required
用于强制参数,@SingleArgument
用于指定与开关关联的一个参数,而 @Toggle
用于指示开关的存在或不存在是什么显着[没有与该开关相关的参数])。
下一个代码清单演示了使用 Commandline 进行命令行解析的“解析”和“询问”阶段。
使用命令行“解析”和“询问”
try { // "Parsing" stage. final Main main = CommandLineParser.parse( Main.class, arguments, OptionStyle.LONG_OR_COMPACT); // "Interrogation" stage. out.println("You provided file name of '" + main.fileName + "' and verbose is set to '" + main.verbose + "'."); } catch (IllegalAccessException | InstantiationException | InvocationTargetException exception) { out.println("ERROR: Unable to parse command-line arguments: " + exception); }
最后一个代码示例演示了解析是通过单个 CommandLineParser.parse(Class<T>, String[], OptionStyle)
调用完成的,查询就像访问该方法返回的实例的成员一样简单。提供给 parse
方法的第三个参数很重要,因为它指示解析器如何期望显示开关。
刚刚显示的代码示例使用 OptionStyle.LONG_OR_COMPACT
,文档对其进行了描述:“长开关前面有两个破折号。短开关前面有一个破折号,可以连接成一个开关。”相反,OptionStyle.SIMPLE
指示解析器期望“所有开关都必须是独立的”和“所有(长和短)都需要在命令行上加上一个破折号。”
下一个屏幕快照演示了这个简单的应用程序的运行情况。
如果未提供必需的参数,则会显示一条消息(包括堆栈跟踪),如下一个屏幕快照所示。
我没有在此处包含使用帮助或基于命令行的用法的示例,因为正如项目的 GitHub 页面 所述,“生成帮助文本”是“目前不受支持的功能”。
以下是在选择库以帮助在 Java 中进行命令行解析时要考虑的命令行的一些其他特性。
commandline-1.7.0.jar
的大小约为 38 KB,并且不依赖于任何其他库。Commandline 是 Java 开发人员可用的众多开源命令行处理库中的另一个,并且与其他几个库一样,它使用注释来完成大部分繁重的工作。
标签2: Java教程地址:https://www.cundage.com/article/jcg-java-command-line-interfaces-part-4-commandline.html