在我的上一篇文章中,我研究了使用 Apache Commons CLI 解析 Java 应用程序中的命令行参数。在这篇文章中,我着眼于使用不同的库执行相同的操作:args4j。
args4j 采用与 Commons CLI 使用的方法不同的方法来指定 Java 应用程序应该期望哪些命令行参数。虽然 Commons CLI 期望表示选项的对象被单独和显式实例化,但 args4j 使用自定义注释来促进命令行参数处理的这个“定义”阶段。命令行选项应该是类中的实例级字段,并使用 @org.kohsuke.args4j.Option 注释进行注释。每个命令行参数的特征都作为此 @Option
注释的属性包含在内。
这篇文章中演示的简单应用程序与我之前的文章中使用的应用程序类似,重点关注用于指定详细程度的可选且无价值的 -v
选项和一个需要的 -f
选项表示文件路径和名称的值。下一个代码清单演示了如何使用 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 ...) 方法:
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) 方法执行此操作的示例。
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-2.33.jar
) 的大小约为 152 KB。@Option
注释上的“hidden”从使用输出中排除命令行参数。args4j 库易于使用并允许高度可读的代码。在决定是否使用 args4j 时,最大的考虑因素可能是决定使用注释指定命令行参数定义的舒适程度。
其他参考资料
标签2: Java教程地址:https://www.cundage.com/article/jcg-java-command-line-interfaces-part-2-args4j.html