JCommando 网站 上将JCommando描述为“命令行参数的Java参数解析器”。 JCommando读取XML配置以生成一个Java类,该类处理Java应用程序中的解析。 在提供XML配置的 Java命令行解析库的本系列文章中,以前涵盖的唯一基于Java的库是JSAP ,但这是该库的第二种配置形式, 我在JSAP的文章中并未介绍XML配置。

由于JCommando使用XML来指定要解析的命令行选项,因此JCommando的“定义”阶段是通过XML规范完成的。 与本系列中的前几篇文章一样, 本篇文章中的示例基于文件路径,名称和详细程度的命令行选项,它们在JCommando兼容XML中的定义显示在下一个代码清单( options.xml )中。

JCommando通过“定义”阶段的XML部分: options.xml

<jcommando><option id="file" long="file" short="f" type="String"><description>Path and name of file</description></option><option id="verbose" long="verbose" short="v"><description>Verbosity enabled</description></option><commandless id="execute" allow-optionless="true"><or><option-ref id="file" /></or></commandless>
</jcommando>

JCommando使用XML文件作为输入,并基于该XML生成一个Java源代码文件,该文件分析XML中指定的选项。 有两种方法可以指示JCommando解析此XML并使用详细信息生成Java源代码。 一种方法是使用JCommando发行版随附的可执行jcomgen可执行文件(在其bin目录中)。 从XML生成Java类的第二种方法是此处显示的方法:使用Apache Ant和JCommando提供的Ant任务。 下一个XML / Ant清单对此进行了演示。

使用JCommando从XML生成源的Ant目标

<target name="generateSourceForJCommando"description="Generate command line parsing source code that uses JCommando"><taskdef name="jcommando" classname="org.jcommando.ant.JCommando"><classpath><pathelement location="C:\lib\jcommando-1.2\lib\jcommando.jar"/></classpath></taskdef><jcommando inputfile="jcommando/options.xml"classname="MainParser"destdir="src"packagename="examples.dustin.commandline.jcommando"/></target>

上述Ant目标节目JCommando如何允许输入XML文件( options.xml )被指定为“ inputfile ”,并且将所生成的Java源代码文件将被放置在所述src目录中的子目录结构相匹配的指定包“ examples.dustin.commandline.jcommando ”。 下一个屏幕快照显示了Ant目标和源代码生成的执行。

这个Ant目标的结果是生成的Java源类MainParser.java其清单如下所示。

生成的Java源类MainParser.java

/** THIS IS A GENERATED FILE.  DO NOT EDIT.** JCommando (http://jcommando.sourceforge.net)*/package examples.dustin.commandline.jcommando;import org.jcommando.Command;
import org.jcommando.JCommandParser;
import org.jcommando.Option;
import org.jcommando.Grouping;
import org.jcommando.And;
import org.jcommando.Or;
import org.jcommando.Xor;
import org.jcommando.Not;/*** JCommando generated parser class.*/
public abstract class MainParser extends JCommandParser
{/*** JCommando generated constructor.*/public MainParser(){Option file = new Option();file.setId("file");file.setShortMnemonic("f");file.setLongMnemonic("file");file.setDescription("Path and name of file");addOption(file);Option verbose = new Option();verbose.setId("verbose");verbose.setShortMnemonic("v");verbose.setLongMnemonic("verbose");verbose.setDescription("Verbosity enabled");addOption(verbose);Command execute = new Command();execute.setName("commandless");execute.setId("execute");execute.addOption(file);execute.setGrouping( createExecuteGrouping() );addCommand(execute);}/*** Called by parser to set the 'file' property.** @param file the value to set.*/public abstract void setFile(String file);/*** Called by parser to set the 'verbose' property.**/public abstract void setVerbose();/*** Called by parser to perform the 'execute' command.**/public abstract void doExecute();/*** Generate the grouping for the 'execute' command.*/private Grouping createExecuteGrouping(){Or or1 = new Or();or1.addOption(getOptionById("file"));return or1;}
}

生成Java源代码后,我们现在有了选项定义。 编写自定义类以扩展生成的MainParser并访问其父级进行解析。 在自定义编写的Main类的下一个代码清单中对此进行了演示,该类扩展了所生成的MainParser类。

自定义类扩展生成的类

package examples.dustin.commandline.jcommando;import static java.lang.System.out;/*** Demonstrates JCommando-based parsing of command-line* arguments from Java code.*/
public class Main extends MainParser
{private String file;private boolean verbose;@Overridepublic void setFile(final String newFilePathAndName){file = newFilePathAndName;}@Overridepublic void setVerbose(){verbose = true;}public static void main(final String[] arguments){final Main instance = new Main();instance.parse(arguments);}/*** Called by parser to execute the 'command'.*/public void doExecute(){out.println("File path/name is " + file + " and verbosity is " + verbose);}
}

如上面显示的自定义Main.java源代码所示,“解析”阶段是通过执行parse(String[])方法在JCommando中完成的,该方法继承自JCommando基于配置XML生成的类(以及生成的类)从其父级JCommandParser类获取其对该parse方法的定义)。

扩展生成的类的自定义类需要具有用于实现选项的“设置”方法。 有了这些适当的实现,基于JCommando的应用程序中的“询问”阶段就很容易访问那些自定义实现的“设置”方法所设置的字段。 最后代码清单中显示的doExecute()方法对此进行了演示。 由于在配置XML中指定了id为“ execute ”的<commandless>元素,因此doExecute方法在生成的父类中作为abstract方法生成。

自定义类最终扩展的JCommandParser类具有方法printUsage() ,可用于将“帮助” /“使用”输出写入标准输出。 可以从GitHub上 Main.java的源代码中看到。

接下来的两个屏幕快照演示了如何执行本文中讨论的示例代码。 第一个屏幕快照显示“可以自动打印的使用信息,在这种情况下,如果未指定所需的”文件”选项。 第二个屏幕快照演示了“ vile”和“ verbose”选项的长名称和短名称的组合。

本文总结了使用JCommando涉及的步骤。

  1. 在XML文件中定义选项。
  2. 使用两种方法之一从XML生成Java解析器源代码。
    • 使用jcomgenbin目录中提供的jcomgen工具。
    • 如本文所展示的,将Ant目标与JCommand提供的Ant任务一起使用。
  3. 编写扩展生成的解析器类的Java类。

选择用于帮助Java进行命令行解析的框架或库时,需要考虑JCommando的特征。

  • JCommando是开源的,可在zlib / libpng许可(Zlib)下获得 。
  • jcommando.jar JAR的大小约为27 KB,并且没有第三方依赖性。
  • 通过XML在JCommando中定义选项是与本系列文章中介绍的其他库不同的方法,但是我发现JCommando的选项定义更有趣的是能够轻松表达选项之间的关系,例如“和”,“或”,“异或” ”,以及这些的嵌套组合。

JCommando在基于Java的命令行选项解析方面实现了一些新颖的概念。 它要求对潜在的命令行选项进行XML配置,但使在这些选项之间建立关系变得容易。 JCommando从XML选项配置生成Java源,并且自定义解析类扩展了该生成的类。 JCommando也是本系列中第一个使用Zlib许可证的库 。

其他参考

  • 突击队
  • JCommando教程
  • JCommando XML标签参考
  • JCommando API文档 (Javadoc)
  • JCommando下载

翻译自: https://www.javacodegeeks.com/2017/10/java-command-line-interfaces-part-25-jcommando.html

Java命令行界面(第25部分):JCommando相关推荐

  1. 成为Java高手的25个学习要点

    成为Java高手的25个学习要点 想要精通Java,成为Java高手,需要不断的学习和积累.本文给出了Java学习过程中需要注意的25个学习目标,希望可以给您带来帮助. AD: 2013大数据全球技术 ...

  2. java面试题25 在程序代码中写的注释太多,会使编译后的程序尺寸变大。

    java面试题25 在程序代码中写的注释太多,会使编译后的程序尺寸变大. A:正确 B:错误 蒙蔽树上蒙蔽果,蒙蔽树下你和我 拿到这道题,我觉得说的贼有道理,注释太多,尺寸变大.无疑与就和驾考 一样, ...

  3. JAVA自学笔记25

    JAVA自学笔记25 1.GUI 1)图形用户接口,以图形的方式,来显示计算机操作的界面,更方便更直观 2)CLI 命令行用户接口,就是常见的Dos,操作不直观 3) 类Dimension 类内封装单 ...

  4. java教学目标_成为Java高手的25个学习目标

    1.需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF,J2EEDP)以及综合模式,应该了解UML,尤其是 class,object,interaction以及statediagrams. ...

  5. 想要成为JAVA高手的25个学习目标

    本文将告诉你学习Java需要达到的25个目标,希望能够对你的学习及找工作有所帮助.对比一下自己,你已经掌握了这25条中的多少条了呢? 1.你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GO ...

  6. Java命令行界面(第30部分):观察

    这个有关Java命令行参数解析的系列文章由四个月来发表的29篇文章组成,涵盖了28个不同的开放源代码库,可用于解析Java命令行参数. 这篇文章收集了可以从本系列的前29篇文章中得出的一些观点,并提供 ...

  7. Java命令行界面(第10部分):picocli

    picocli主页面将picocli描述为"强大的微小命令行界面"," picocli"是一个文件Java框架,用于解析命令行参数并生成精美,易于定制的用法帮助 ...

  8. Java命令行界面(第21部分):航空公司2

    本系列文章的第21篇关于Java中解析命令行参数的文章的重点是Airline 2库. Airline 2的GitHub项目页面描述了该库," Airline是一个Java库,提供了基于注释的 ...

  9. Java命令行界面(第1部分):Apache Commons CLI

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

最新文章

  1. led灯光衰怎么解决_什么是LED光衰,光衰怎么解决?
  2. Kubernetes — 安装 Metrics Server
  3. nboot,eboot和uboot
  4. 可作为工质状态参数的是_制冷工质的热力状态参数都有哪些?
  5. opc ua服务器大批量修改,opc ua服务器 数据配置
  6. 《系统集成项目管理工程师》必背100个知识点-07项目建议书的内容
  7. ES 11 - 配置Elasticsearch的映射 (mapping)
  8. [转]android sqlite db-journal文件产生原因及说明
  9. MyBatis 学习之路其一:使用mybatis 创建一个简单的程序
  10. 三菱驱动器参数表_三菱 M 参数表
  11. DirectX11 SDK 例程报错解决方法
  12. 学生网站模板——我的家乡-云南(9页) HTML+CSS+JavaScript 关于我的家乡的HTML网页设计-----云南
  13. 如何在win7系统上装苹果雪豹操作系统
  14. 荣耀9igoogle模式_创建自己的简单iGoogle小工具
  15. IC数字常见问题(一)时钟
  16. NEFU OJ 1266-快乐的雨季-线段树【题解】
  17. 华为nova青春版是html手机吗,华为Nova青春版这款手机作为新青年良品:麒麟935+4G+64GB+18W快充...
  18. excel表格显示无法连接服务器,打开工作簿时Excel总是提示包含无法更新的链接?...
  19. 吞噬星空鸿蒙殿主,论《吞噬星空》是鸿蒙三部曲的最后一部!
  20. Keystore file ‘D:\ruhai\xx.jks‘ not found for signing config ‘debug‘

热门文章

  1. Java 中的 String 真的是不可变的吗
  2. 关系型数据的分布式处理系统:Cobar
  3. Redis 的 4 大法宝,2018 必学中间件
  4. 程序员如何面对 HR 面试的 40 个问题
  5. 阿里面试回来,想和 Java 程序员谈一谈
  6. 漫画算法:辗转相除法是什么鬼
  7. 对于这款APP,我充了个终身VIP!!!
  8. 你们好好的学,回头教教我~
  9. CSS3中的动画示例
  10. 集合还有这么优雅的运算法?