Programovanie

Analýza príkazového riadku s rozhraním Apache Commons CLI

Z času na čas potrebujem v Jave spracovať argumenty príkazového riadku buď pre aplikácie založené na Jave, alebo pre implementácie funkcií main (), ktoré poskytujú jednoduchý testovací mechanizmus priamo v testovanej triede. Vývojár Java má veľa možností na analýzu príkazového riadku. Ak je k dispozícii iba jeden, dva alebo malý počet argumentov príkazového riadku (najmä ak je potrebná prítomnosť alebo neprítomnosť príznaku namiesto sprievodnej hodnoty), napíšte niekoľko riadkov kódu na spracovanie týchto príkazových riadkov. možnosti linky nie je veľký problém. Ak existuje viac možností a / alebo niektoré možnosti majú hodnoty, je pekné získať prístup k sofistikovanejšej podpore analýzy príkazového riadku.

V tejto položke blogu sa pozriem na používanie knižnice Apache Commons CLI, ale existuje veľa ďalších možností, ako napríklad args4j, analýza príkazového riadku TE-Code, CLAJR (Argumenty príkazového riadku s reflexiou Java), JArgs, JSAP (Java Simple Argument Processor) a niekoľko ďalších (ešte viac tu).

Aj keď je knižnica Apache Commons CLI súčasťou Apache Commons, jedná sa o samostatné stiahnutie (JAR) zo súboru JAR pre Apache Commons Modeler a zo súboru JAR pre Apache Commons Lang, o ktorom som hovoril v predchádzajúcich položkách blogu, ktoré sú tu a tu. Pre tento príspevok do blogu používam rozhranie CLI 1.1, pretože sa neočakáva vydanie CLI 2.0 (ďalšie informácie nájdete na konci tohto článku).

Ukážem niekoľko veľmi jednoduchých príkladov rozhrania Apache Common CLI a uvediem odkazy na ďalšie zdroje týkajúce sa používania tejto knižnice.

Dve dôležité triedy, ktoré sa používajú v rozhraní Apache Common CLI, sú trieda org.apache.commons.cli.Option a úzko súvisiaca org.apache.commons.cli.Options (obsahuje viac inštancií Možnosť trieda). Tieto triedy sa používajú na predstavenie očakávaných možností príkazového riadku. Nasledujúce dva úryvky kódu demonštrujú nastavenie triedy Options pre možnosti v štýle Posix a možnosti v štýle GNU.

Používanie triedy možností s viacerými inštanciami možností

 / ** * Vytvorte a poskytnite možnosti kompatibilné s Posix. * * @return Možnosti očakávané z príkazového riadku formulára Posix. * / public static Možnosti constructPosixOptions () {konečné možnosti posixOptions = nové Možnosti (); posixOptions.addOption ("display", false, "Display the state."); návrat posixMožnosti; } / ** * Zostavte a poskytnite možnosti kompatibilné s GNU. * * @return Možnosti očakávané z príkazového riadku formulára GNU. * / public static Možnosti constructGnuOptions () {konečné možnosti gnuOptions = nové Možnosti (); gnuOptions.addOption ("p", "tlač", nepravda, "Možnosť tlače") .addOption ("g", "gui", false, "možnosť HMI") .addOption ("n", true, "Počet kópie “); návrat gnuOptions; } 

V príkladoch nastavenia možností si všimnite, že zatiaľ nie je žiadny rozdiel v zaobchádzaní s možnosťami v štýle Posix oproti možnostiam v štýle GNU. Zatiaľ je k možnostiam možné pristupovať rovnako.

Pred prechodom na demonštráciu analýzy argumentov príkazového riadku pomocou príkazu CLI na základe týchto predpokladaných možností stojí za zmienku podpora CLI pre informácie o použití a pomocné informácie prostredníctvom triedy org.apache.commons.cli.HelpFormatter. Táto užitočná trieda nástrojov obsahuje metódy, ako sú preťažené verzie printHelp, preťažené verzie printUsage a niekoľko ďalších výstupov a súvisiacich metód.

Nasledujúci úryvok kódu demonštruje metódu, ktorá využíva jednu z metód printUsage v HelpFormatter a jednu z metód printHelp v tejto triede.

printUsage () a printHelp ()

 / ** * Tlač informácií o použití na poskytnutý výstupný prúd. * * @param applicationName Názov aplikácie, ktorá sa má uviesť v zozname použití. * @param options Možnosti príkazového riadku, ktoré majú byť súčasťou použitia. * @param out OutputStream, do ktorého sa majú zapisovať informácie o použití. * / public static void printUsage (final String applicationName, final Options options, final OutputStream out) {final PrintWriter writer = new PrintWriter (out); final HelpFormatter usageFormatter = nový HelpFormatter (); usageFormatter.printUsage (zapisovač, 80, applicationName, možnosti); writer.close (); } / ** * Napíšte „pomoc“ do poskytnutého OutputStream. * / public static void printHelp (posledné možnosti Možnosti, konečný int printRowWidth, konečná hlavička reťazca, posledná päta reťazca, konečná int medzeryBeforeOption, konečná int medzeryBeforeOptionDescription, konečná boolean displayUsage, konečná výstupná výstupná reklama) {final String commandLineSyntax = "java -cp ApacheCommonsCLI. džbán “; finálny zapisovač PrintWriter = nový PrintWriter (out); posledný HelpFormatter helpFormatter = nový HelpFormatter (); helpFormatter.printHelp (zapisovač, printedRowWidth, commandLineSyntax, hlavička, možnosti, spacesBeforeOption, spacesBeforeOptionDescription, päta, displayUsage); writer.close (); } 

Nasledujúci úryvok kódu zobrazuje niektoré volania metód printHelp () a printUsage () uvedených vyššie a za ním nasleduje snímka obrazovky zobrazujúca výstup z ich spustenia.

 System.out.println ("- POUŽITIE -"); printUsage (applicationName + "(Posix)", constructPosixOptions (), System.out); displayBlankLines (1, System.out); printUsage (applicationName + "(Gnu)", constructGnuOptions (), System.out); displayBlankLines (4, System.out); System.out.println ("- HELP -"); printHelp (constructPosixOptions (), 80, "POSIX HELP", "End of POSIX Help", 3, 5, true, System.out); displayBlankLines (1, System.out); printHelp (constructGnuOptions (), 80, "GNU HELP", "Koniec GNU Help", 5, 3, true, System.out); 

Prvá snímka obrazovky zobrazuje výsledky, keď sa vyššie uvedený kód vykoná presne tak, ako je to znázornené (s pravda prešla na obe použitia printHelp metóda označujúca, že možnosti by mali byť zahrnuté v časti na používanie). Snímka druhej obrazovky ukazuje, čo sa stane, keď dôjde na druhé volanie printHelp má false prešiel na to, aby sa možnosti nezobrazili.

printUsage a printHelp

printUsage a printHelp s One printHelp Nezobrazuje možnosti

Aj keď sú informácie o použití a pomocné informácie o možnostiach, ako už ich názvy naznačujú, užitočné a užitočné, skutočným dôvodom použitia argumentov príkazového riadku je zvyčajne ovládanie správania aplikácie. Nasledujúci zoznam kódov ukazuje dve metódy syntaktickej analýzy argumentov príkazového riadku v štýle GNU a Posix. Aj keď sa nastavenie Možnosti nestaralo o konkrétny štýl, okrem určenia samotných možností, typ možnosti je teraz dôležitý pre určenie vhodného syntaktického analyzátora, ktorý sa má použiť.

usePosixParser () a useGnuParser ()

 / ** * Použite Apache Commons CLI PosixParser na argumenty príkazového riadku. * * @param commandLineArguments Argumenty príkazového riadku, ktoré sa majú spracovať pomocou syntaktického analyzátora * Posix. * / public static void usePosixParser (final String [] commandLineArguments) {final CommandLineParser cmdLinePosixParser = nový PosixParser (); posledné možnosti posixOptions = constructPosixOptions (); CommandLine commandLine; try {commandLine = cmdLinePosixParser.parse (posixOptions, commandLineArguments); if (commandLine.hasOption ("display")) {System.out.println ("Chcete displej!"); }} catch (ParseException parseException) // skontrolovala výnimku {System.err.println ("Vyskytla sa výnimka pri analýze pomocou PosixParser: \ n" + parseException.getMessage ()); }} / ** * Použiť Apache Commons CLI GnuParser na argumenty príkazového riadku. * * @param commandLineArguments Argumenty príkazového riadku, ktoré sa majú spracovať pomocou analyzátora * Gnu-style. * / public static void useGnuParser (final String [] commandLineArguments) {final CommandLineParser cmdLineGnuParser = nový GnuParser (); posledné možnosti gnuOptions = constructGnuOptions (); CommandLine commandLine; try {commandLine = cmdLineGnuParser.parse (gnuOptions, commandLineArguments); if (commandLine.hasOption ("p")) {System.out.println ("Chcete tlačiť (zvolené p)!"); } if (commandLine.hasOption ("print")) {System.out.println ("Chcete tlačiť (zvolená tlač)!"); } if (commandLine.hasOption ('g')) {System.out.println ("Chceš GUI!"); } if (commandLine.hasOption ("n")) {System.out.println ("Vybrali ste číslo" + commandLine.getOptionValue ("n")); }} catch (ParseException parseException) // skontrolovala výnimku {System.err.println ("Vyskytla sa výnimka pri analýze pomocou GnuParser: \ n" + parseException.getMessage ()); }} 

Keď sa vykoná vyššie uvedený kód, jeho výstup vyzerá ako výstup zobrazený v nasledujúcich dvoch snímkach obrazovky:

Výsledky PosixParser

Výsledky analyzátora GNU

Kompletný príklad

Teraz je pre uľahčenie uvedený kompletný kód vzorovej aplikácie, z ktorej sa vyššie zobrazovali časti.

$config[zx-auto] not found$config[zx-overlay] not found