Java命令行界面(第25部分):JCommando

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙系统6月可升级,华为鸿蒙2.0系统大规模升级从6月开始?

你现在使用的智能手机是什么&#xff0c;苹果的iPhone手机&#xff0c;华为智能手机&#xff0c;小米手机还是其他智能手机。从操作系统来看目前的智能手机基本上可以分成iPhone手机跟安卓智能手机&#xff0c;其中iPhone手机使用的是iOS系统&#xff0c;而其他智能手机操作系统…

wso2 esb_WSO2 ESB的一种消息传递方式

wso2 esb正如我之前在WSO2 ESB工作时所发布的那样。 为了更好地理解此ESB&#xff0c;我一直在浏览示例 &#xff08;尚未完成所有示例 &#xff09;。 示例12是关于与ESB的单向消息传递&#xff0c;并使用TCP监视器使其可见。 我之前已经介绍过如何设置类似的工具“ TcpTunnel…

android 录像机,android 录像机

一直都做camera 录像功能其实知道的很少&#xff0c;以前也是迷迷糊糊知道怎么写个video&#xff0c;今天测试了一下&#xff0c;各种问题。问题来源首先是对于SDK的阅读不够仔细。 实践的比较少。 其实所谓的录像 就是两个类的结合 一个是Camera 一个是MediaRecorder 这两个类…

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

本系列文章的第21篇关于Java中解析命令行参数的文章的重点是Airline 2库。 Airline 2的GitHub项目页面描述了该库&#xff0c;“ Airline是一个Java库&#xff0c;提供了基于注释的框架来解析命令行界面。” 该页面进入状态&#xff1a;航空公司“既支持简单的单个命令&#xf…

android中进度条的使用,android的进度条使用

android的进度条1、实现的效果2、布局代码先写一个my_browser.xml文件 存放WebViewandroid:layout_width"fill_parent"android:layout_height"fill_parent"android:orientation"vertical" >android:id"id/webView"android:layout_w…

应用服务器web服务器_最受欢迎的应用服务器

应用服务器web服务器这是本系列的第二篇文章&#xff0c;我们将发布有关Java安装的统计数据。 使用的数据集来自免费的Plumbr安装&#xff0c;在过去六个月中&#xff0c;我们总共收集了1,024个不同的环境。 该系列的第一篇文章分析了基础-运行JVM的操作系统&#xff0c;是32位…

如何在Java 8中将Lambda表达式转换为方法引用?

如果您使用Java 8进行编码&#xff0c;那么您会知道使用方法引用代替lambda表达式会使您的代码更具可读性&#xff0c;因此建议尽可能使用方法引用替换lambda表达式&#xff0c;但是&#xff0c;最大的问题是&#xff0c;您如何查找是否可以用方法引用替换lambda&#xff1f; 是…

最大化窗口设置_打开表格总是默认窗口最小化?适用Word、PPT等其他应用

今天有小哥哥说每天早上上班打开第一个表格时&#xff0c;这样显示&#xff1b;打开第二个表时是这样显示&#xff1b;每次打开第二个表后点最大化再打开其他的表才正常显示为最大化的状态。其实&#xff0c;这只是表格的默认打开方式改变了&#xff0c;我们改正过来就好了。在…

html5块元素代码,html5 区块与内联div 与span html块级元素(示例代码)

HTML 和 可以通过 和 将 HTML 元素组合起来。HTML 块元素大多数 HTML 元素被定义为块级元素或内联元素。编者注&#xff1a;"块级元素"译为 block level element&#xff0c;"内联元素"译为 inline element。块级元素在浏览器显示时&#xff0c;通常会以新…

html页面js遍历listview,javascript实现的listview效果

javascript实现的listview效果更新时间&#xff1a;2007年04月28日 00:00:00 作者&#xff1a;#oContainer {width: 600px;height: 500px;border: 1px solid menu;margin: 0px;padding: 0px;overflow: hidden;}a {color: black;text-decoration: none;}a:hover {color: red;t…

Apache Ignite本机持久性,简要概述

通过将数据的工作集放入系统内存中&#xff0c;内存中方法可以达到极高的速度。 当所有数据都保存在内存中后&#xff0c;处理使用传统旋转磁盘引起的问题的需求就消失了。 例如&#xff0c;这意味着无需维护数据的其他缓存副本并管理它们之间的同步。 但是这种方法还有一个缺点…

Java命令行界面(第23部分):Rop

Rop库在其主页上被描述为“用Java编写的轻量级命令行选项解析器”。 Rop的“简介”还指出&#xff1a;“ Rop的设计目的是最小化同时方便&#xff0c;并涵盖了大多数常见的命令行解析用例。” 这篇文章是本系列中第23篇有关解析Java命令行参数的文章 &#xff0c;重点是Rop。 …

Java 9,Jigsaw,JPMS和模块:个人探索

Java 9由于Jigsaw项目而延迟了很多次&#xff0c;您可能会听到很多关于模块&#xff0c;模块化和其他内容的信息&#xff0c;那么&#xff0c;它的全部含义是什么&#xff1f; 模块化到底是什么&#xff0c;模块化平台是什么意思&#xff1f; Java平台模块系统&#xff08;JPMS…

仪征市第二中学计算机老师,静心倾听花自开 ——仪征市第二中学徐丞老师

原标题&#xff1a;静心倾听花自开 ——仪征市第二中学徐丞老师徐丞老师是我校一名优秀的青年教师。自2004年从教以来&#xff0c;他满怀对教育事业的真诚&#xff0c;立足本职&#xff0c;默默耕耘&#xff0c;在平凡中成就着不平凡。在教育教学过程中&#xff0c;徐丞老师始终…

智慧物业小程序_刷脸支付+电商小程序+智慧酒店营销方案

我们这边刷脸支付电商小程序智慧酒店行业解决方案&#xff0c;支付宝微信订房小程序&#xff0c;芝麻信用免押住&#xff0c;数字化经营发券引流&#xff0c;未来酒店:0押金 0房费 退房扣款&#xff0c;不占用资金&#xff0c;用户增长信用分&#xff0c;线上订房小程序&#x…

# 字符串从右往左查找_字符串匹配(搜索,查找)算法

(一)前言所谓的字符串匹配就是在一个长字符串(可称文本T)中找一个短字符串(可称模式P)&#xff0c;看长字符串中是否存在短字符串&#xff0c;若存在则返回出现的第一个位置&#xff0c;若不存在则返回一个标记。字符串搜索算法有很多&#xff0c;比较知名的自然是大名鼎鼎Knut…

html5按钮样式具有子项目,如何使用HTML5+css3制作出12种常用的按钮开关样式(附完整代码)...

现如今前端网页的开发越来越注重设计感&#xff0c;这些设计感更体现在细节处&#xff0c;今天向大家具体介绍一下各式各样的开关按钮是如何使用HTML5css3制作出来的&#xff0c;希望可以帮到大家。使用HTML5css3制作按钮开关的原理根据设计的要求填充各种颜色。按钮开关的形状…

Java命令行界面(第17部分):jw-options

JavaWorld文章处理Java中的命令行参数&#xff1a; Matthias Laux博士关闭的案例介绍了一个基于Java的简单库&#xff0c;用于处理命令行参数 &#xff0c;在本文中我将其称为jw-options 。 被引用的文章提供了有关为何在构造Options类时做出某些设计决策的背景信息。 本文的“…

便捷式计算机无线功能按钮,TP-Link TL-MR13U便携式无线路由器Client模式设置

本文介绍了TP-Link TL-MR13U便携式无线路由器&#xff0c;在“客户端模式(Client)”下的设置方法。TL-MR13U工作在“客户端模式(Client)”时&#xff0c;主要作用是用来接收无线WiFi信号&#xff0c;把无线WiFi信号转换为有线网络&#xff0c;实现让台式电脑上网。TP-Link TL-M…

Java命令行界面(第6部分):JOpt简单

JOpt Simple的主页将这个基于Java的库称为“用于解析命令行选项的Java库&#xff0c;例如您可能传递给调用javac的Java库&#xff0c;”该Java库试图“使用POSIX getopt&#xff08;&#xff09;的命令行选项语法&#xff09;和GNU getopt_long&#xff08;&#xff09; 。” 这…