Java命令行界面(第25部分):JCommando
JCommando 網(wǎng)站 上將JCommando描述為“命令行參數(shù)的Java參數(shù)解析器”。 JCommando讀取XML配置以生成一個Java類,該類處理Java應用程序中的解析。 在提供XML配置的 Java命令行解析庫的本系列文章中,以前涵蓋的唯一基于Java的庫是JSAP ,但這是該庫的第二種配置形式, 我在JSAP的文章中并未介紹XML配置。
由于JCommando使用XML來指定要解析的命令行選項,因此JCommando的“定義”階段是通過XML規(guī)范完成的。 與本系列中的前幾篇文章一樣, 本篇文章中的示例基于文件路徑,名稱和詳細程度的命令行選項,它們在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發(fā)行版隨附的可執(zhí)行jcomgen可執(zhí)行文件(在其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目標節(jié)目JCommando如何允許輸入XML文件( options.xml )被指定為“ inputfile ”,并且將所生成的Java源代碼文件將被放置在所述src目錄中的子目錄結構相匹配的指定包“ examples.dustin.commandline.jcommando ”。 下一個屏幕快照顯示了Ant目標和源代碼生成的執(zhí)行。
這個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源代碼后,我們現(xiàn)在有了選項定義。 編寫自定義類以擴展生成的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源代碼所示,“解析”階段是通過執(zhí)行parse(String[])方法在JCommando中完成的,該方法繼承自JCommando基于配置XML生成的類(以及生成的類)從其父級JCommandParser類獲取其對該parse方法的定義)。
擴展生成的類的自定義類需要具有用于實現(xiàn)選項的“設置”方法。 有了這些適當?shù)膶崿F(xiàn),基于JCommando的應用程序中的“詢問”階段就很容易訪問那些自定義實現(xiàn)的“設置”方法所設置的字段。 最后代碼清單中顯示的doExecute()方法對此進行了演示。 由于在配置XML中指定了id為“ execute ”的<commandless>元素,因此doExecute方法在生成的父類中作為abstract方法生成。
自定義類最終擴展的JCommandParser類具有方法printUsage() ,可用于將“幫助” /“使用”輸出寫入標準輸出。 可以從GitHub上 Main.java的源代碼中看到。
接下來的兩個屏幕快照演示了如何執(zhí)行本文中討論的示例代碼。 第一個屏幕快照顯示“可以自動打印的使用信息,在這種情況下,如果未指定所需的”文件”選項。 第二個屏幕快照演示了“ vile”和“ verbose”選項的長名稱和短名稱的組合。
本文總結了使用JCommando涉及的步驟。
- 使用jcomgen的bin目錄中提供的jcomgen工具。
- 如本文所展示的,將Ant目標與JCommand提供的Ant任務一起使用。
選擇用于幫助Java進行命令行解析的框架或庫時,需要考慮JCommando的特征。
- JCommando是開源的,可在zlib / libpng許可(Zlib)下獲得 。
- jcommando.jar JAR的大小約為27 KB,并且沒有第三方依賴性。
- 通過XML在JCommando中定義選項是與本系列文章中介紹的其他庫不同的方法,但是我發(fā)現(xiàn)JCommando的選項定義更有趣的是能夠輕松表達選項之間的關系,例如“和”,“或”,“異或” ”,以及這些的嵌套組合。
JCommando在基于Java的命令行選項解析方面實現(xiàn)了一些新穎的概念。 它要求對潛在的命令行選項進行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的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓版的微博怎么下载(安卓版的微博)
- 下一篇: wso2 esb_WSO2 ESB的一种