Java命令行接口(第13部分):JArgs


JArgs1.0的区别在于它是我的系列文章第13篇关于用Java解析命令行参数的主题。JArgs是开源的(BSD license)库,主要由different contributors包括Steve PurcellEwan Mellor。事实证明,这可能会在首次使用JArgs时导致一些混乱,因为包名和其他细节会根据您应用的JArgs版本而变化。

JArgs project page将JArgs描述为“一套方便、紧凑、预打包和全面记录的命令行选项分析器,供Java程序员使用。”该页面断言JArgs可能比其他基于Java的命令行处理库更容易选择,因为JArgs“易于使用、经过全面测试、有良好的文档记录和自由许可(BSD许可,所以没有GNU混乱)。”该页面还指出,“该包很小,没有多余的东西,但是很实用,并且包含已经在生产中使用了相当长时间的代码。”

JArgs确实很小。jargs-1.0.zip文件的大小不到200千字节,提取的核心jargs.jar只有大约12千字节。没有第三方库依赖关系。下面的屏幕快照演示了jargs.jar的内容downloaded from SourceForge(jargs-1.0.jaravailable on the Maven Repository是相似的)。

JArgs的文档主要由它的Javadoc-generated API documentation和代码示例,例如OptionTestCustomOptionTest

当使用JArgs时,人们使用的主要类是CmdLineParserjargs.gnu.CmdLineParser或者com.sanityinc.jargs.CmdLineParser这取决于你从哪里获得JArgs的发行版以及你获得的版本)。如果使用JArgs JARavailable via SourceForge download或者通过Maven Repository,您将使用的主要类是jargs.gnu.CmdLineParser。另一方面,如果你从源代码中构建JArgsavailable on GitHub (purcell/jargs),主类将是com.sanityinc.jargs.CmdLineParser。无论哪种情况,都只有一个CmdLineParser它使用嵌套类来提供额外的支持。在这篇文章中,我将演示基于SourceForge/Maven JARs的例子jargs.gnu.CmdLineParser。我的例子的完整源代码将是posted on GitHub该版本可能会被编辑以利用更明确的导入,从而提高代码的简洁性和可读性。

JArgs很小,所以令人惊讶的是很简单。它没有提供很多奇特的特性,但是它通过一种简单的编程方法进行基本的命令行参数处理,这种方法不使用注释或反射。

为了用JArgs实现命令行参数解析的“定义”阶段,需要实例化CmdLineParser类并调用addOption(CmdLineParser.Option) method对于每个预期命令行选项。每个选项都由扩展CmdLineParser.Option班级。在本系列的示例中,我使用了基于字符串的文件路径/名称选项和基于布尔的详细度选项。因此,在这些例子中使用JArgs时,我可以使用类CmdLineParser.Option.StringOption对于文件路径和名称以及类CmdLineParser.Option.BooleanOption对于详细选项。下一个代码清单演示了用JArgs实现“定义”阶段。

贾格斯的“定义”阶段

public static void main(final String[] arguments)  
{  
   final CmdLineParser cmdLineParser = new CmdLineParser();  
   final CmdLineParser.Option fileOption = new CmdLineParser.Option.StringOption('f', "file");  
   cmdLineParser.addOption(fileOption);  
   final CmdLineParser.Option verbosityOption = new CmdLineParser.Option.BooleanOption('v', "verbose");  
   cmdLineParser.addOption(verbosityOption); 


用JArgs进行“解析”只需要一条语句,但是您确实需要捕获由CmdLineParser.parse(String[])方法或显式声明这些是从使用方法调用的代码中抛出的。这将在下一个代码清单中显示。

用JArgs“解析”阶段

当刚刚显示的代码成功执行(没有引发两个选中的异常中的任何一个)时,的实例CmdLineParser在此基础上parse(String[])方法现在包含为预期命令行选项解析的值,因此我们准备“询问”该实例。

命令行选项处理的JArgs“询问”阶段使用CmdLineParser.Option-扩展前面讨论的类,以检索为每个选项解析的值。有重载版本的CmdLineParser.getOptionValue()执行该询问的方法。该方法只接受需要其值的选项实例[getOptionValue(CmdLineParser.Option)]返回null如果没有找到或解析该选项。该方法接受值为所需的选项实例和第二个“默认”对象[getOptionValue(CmdLineParser.Option, Object)]如果没有找到或分析该选项,则返回提供的默认对象。在下面的代码清单中,我在两种情况下都使用了第二种形式,从而确保我不必处理null

贾格斯的“审问”舞台

final String filePathName = cmdLineParser.getOptionValue(fileOption, "null").toString();  
if (filePathName.equals("null"))  
{  
   out.println("ERROR: File path/name must be provided.");  
   System.exit(-2);  
}  
out.println(  
     "File path/name is " + filePathName  
   + " and verbosity is " + cmdLineParser.getOptionValue(verbosityOption, false)  
   + ".");  


有了这些基本的代码示例,运行使用JArgs进行命令行处理的简单的Java应用程序将在下面的屏幕快照中得到演示。

CmdLineParser类没有任何内置的帮助/用法支持。然而,SourceForge上的jargs-1.0 . zip可用的源代码包括AutoHelpParser,一个扩展的类CmdLineParser并说明了如何实现帮助/使用。

由于它的过时和简单性,JArgs可能比本系列中讨论的其他基于Java的命令行解析库更适用于旧版本的Java。当我运行javap时CmdLineParser在Maven提供的jargs-1.0.jar和SourceForge提供的jargs.jar,为了确定它的编译版本,我看到了它的主要版本45!正如我在“以编程方式确定Java类的JDK编译版本”一文中所写的,45的主要版本表明代码是用JDK 1.1

maven-提供jargs-1.0.jar来自javap的版本信息

Classfile jar:file:/C:/lib/jargs-1.0/lib/jargs-1.0.jar!/jargs/gnu/CmdLineParser.class
  Last modified Apr 9, 2005; size 6032 bytes
  MD5 checksum b2d61c0ce786f8a661cccf1e61de2a19
  Compiled from "CmdLineParser.java"
public class jargs.gnu.CmdLineParser
  minor version: 3
  major version: 45


source forge-提供jargs.jar来自javap的版本信息

Classfile jar:file:/C:/lib/jargs-1.0/lib/jargs.jar!/jargs/gnu/CmdLineParser.class
  Last modified Apr 9, 2005; size 6032 bytes
  MD5 checksum b2d61c0ce786f8a661cccf1e61de2a19
  Compiled from "CmdLineParser.java"
public class jargs.gnu.CmdLineParser
  minor version: 3
  major version: 45


当选择一个框架或库来帮助用Java进行命令行解析时,下面是JArgs需要考虑的特性。

  • JArgs是开源的,并获得了BSD许可。
  • JArgs的版本和主要贡献者似乎有些混乱MavenSourceForge有一个版本purcell/jargs on GitHub拥有另一个版本。
  • JArgs既小又简单:jargs.jar(或jargs-1.0.jar在Maven上)只有大约12 KB的大小,并且没有第三方库依赖。
  • JArgs使用编程API来定义、解析和查询选项,而不是使用注释或反射。
  • JArgs有些过时,它的许多主页都有“最新更新”,比如2005年。然而,在这篇文章中多次提到的GitHub页面,它的主类有不同的包名,显示了它最近的更新是在2012年。
  • 我相信JArgs可以用于今天绝大多数的Java应用程序,因为在我看来,它可以与早在Java SE 1.1

人们可能不得不使用JArgs来代替其他一些更常用的和/或最近更新的基于Java的命令行处理的最有说服力的原因是它的简单性和小尺寸。我有时会面临这样的决定:我想要支持哪种级别的命令行选项,JArgs提供了一个库,当我想要的不仅仅是直接解析传入的内容时,这个库可能是理想的String[]但是不想要其他一些基于Java的命令行处理库的功能和复杂性。我对使用JArgs最大的担心可能是它已经有一段时间没有更新了,可能会给使用我的工作的其他人带来潜在的混乱,并且不得不处理JArgs的两种不同的表现形式,用不同的包名作为它的主类(使用Maven作为依赖项在这里会有很大帮助)。JArgs既小又简单,可能适合那些只需要最基本的命令行处理的人。

附加参考