Programmēšana

Komandrindas parsēšana ar Apache Commons CLI

Laiku pa laikam man rodas nepieciešamība rīkoties ar Java komandrindas argumentiem Java lietojumprogrammām vai galveno () funkciju ieviešanai, kas nodrošina vienkāršu testēšanas mehānismu tieši pārbaudāmajā klasē. Java izstrādātājam ir daudz iespēju komandrindas parsēšanai. Ja komandrindas argumentu ir tikai viens, divi vai maz (īpaši, ja ir nepieciešama tikai karodziņa klātbūtne vai neesamība, nevis pavadošā vērtība), uzrakstiet dažas koda rindas, lai apstrādātu šīs komandrindas. līnijas iespējas nav liels darījums. Ja ir vairāk opciju un / vai dažām opcijām ir vērtības, ir patīkami piekļūt sarežģītākam komandrindas parsēšanas atbalstam.

Šajā emuāra ierakstā es apskatīšu Apache Commons CLI bibliotēkas izmantošanu, taču ir daudz citu iespēju, piemēram, args4j, TE-Code komandrindas parsēšana, CLAJR (komandrindas argumenti ar Java atspoguļojumu), JArgs, JSAP (Java Simple Argumentu procesors), un vairāki citi (šeit vēl vairāk).

Lai gan Apache Commons CLI bibliotēka ir daļa no Apache Commons, tā ir atsevišķa (JAR) lejupielāde no JAR lejupielādes Apache Commons Modeler un no JAR lejupielādes Apache Commons Lang, par kuru es runāju iepriekšējos emuāra ierakstos, kas pieejami šeit un šeit. Šim emuāra ierakstam es izmantoju CLI 1.1, jo nav paredzama CLI 2.0 izlaišana (sīkāka informācija par to šī ieraksta beigās).

Es parādīšu dažus ļoti vienkāršus Apache Common CLI piemērus un iekļaušu dažas saites uz citiem resursiem par šīs bibliotēkas izmantošanu.

Divas svarīgas Apache Common CLI izmantošanas klases ir org.apache.commons.cli.Option klase un cieši saistītā org.apache.commons.cli.Options (satur vairākus Opcija klase). Šīs klases tiek izmantotas, lai attēlotu paredzamās komandrindas opcijas. Šie divi koda fragmenti parāda Opciju klases iestatīšanu Posix stila opcijām un GNU stila opcijām.

Opciju klases izmantošana ar vairākiem opciju gadījumiem

 / ** * Konstruējiet un nodrošiniet ar Posix saderīgas opcijas. * * @return Iespējas, kas sagaidāmas no Posix formas komandrindas. * / public static Options constructPosixOptions () {final Options posixOptions = new Options (); posixOptions.addOption ("display", false, "Display the state"); atgriezties posixOptions; } / ** * Konstruējiet un sniedziet ar GNU saderīgas opcijas. * * @return Iespējas, kas sagaidāmas no GNU formas komandrindas. * / public static Options constructGnuOptions () {final Options gnuOptions = new Options (); gnuOptions.addOption ("p", "print", false, "Drukāšanas opcija"). addOption ("g", "gui", false, "HMI opcija"). addOption ("n", true, "Number of kopijas "); atgriezt gnuOptions; } 

Opciju iestatīšanas piemēros ņemiet vērā, ka pagaidām nav atšķirības Posix stila un GNU stila opciju apstrādē. Līdz šim iespējas var izturēties vienādi.

Pirms pāriet uz CLI komandrindas argumentu parsēšanu, pamatojoties uz šīm gaidāmajām opcijām, ir vērts atzīmēt CLI atbalstu lietošanas informācijai un palīdzības informācijai, izmantojot klasi org.apache.commons.cli.HelpFormatter. Šajā noderīgajā utilītu klasē ir tādas metodes kā pārslogotas printHelp versijas, pārslogotas printUsage versijas un vairākas citas izejas un saistītās metodes.

Šis koda fragments parāda metodi, kas izmanto vienu no HelpFormatter's printUsage metodēm un vienu no šīs klases printHelp metodēm.

printUsage () un printHelp ()

 / ** * Izdrukājiet lietošanas informāciju norādītajā OutputStream. * * @param applicationName Lietojumam pievienojamā lietojumprogrammas nosaukums. * @param options Komandrindas opcijas, kas ir daļa no lietošanas. * @param out OutputStream, kurā ierakstīt informāciju par lietošanu. * / public static void printUsage (final String applicationName, final Options options, final OutputStream out) {final PrintWriter writer = new PrintWriter (out); galīgā HelpFormatter useFormatter = jauna HelpFormatter (); useFormatter.printUsage (rakstītājs, 80, lietojumprogrammas nosaukums, opcijas); rakstnieks.slēgt (); } / ** * Rakstiet “help” paredzētajā OutputStream. * / public static void printHelp (galīgās opciju opcijas, gala int printRowWidth, pēdējās virknes galvene, pēdējās virknes kājene, pēdējās int atstarpesBeforeOption, pēdējās int atstarpesBeforeOptionDescription, galīgais boolean displayUsage, final OutputStream out) {final String commandLineSyntax = "java -cp ApacheCommonsCLI. burka "; gala PrintWriter rakstnieks = new PrintWriter (out); galīgā HelpFormatter helpFormatter = jauna HelpFormatter (); helpFormatter.printHelp (rakstītājs, printRowWidth, commandLineSyntax, galvene, opcijas, atstarpesBeforeOption, atstarpesBeforeOptionDescription, kājene, displayUsage); rakstnieks.slēgt (); } 

Nākamais koda fragments parāda dažus zvanus uz iepriekš parādītajām metodēm printHelp () un printUsage (), un pēc tam seko ekrāna momentuzņēmums, kurā parādīta to izpildes izeja.

 System.out.println ("- LIETOŠANA -"); printUsage (applicationName + "(Posix)", constructPosixOptions (), System.out); displayBlankLines (1, System.out); printUsage (lietojumprogrammasName + "(Gnu)", constructGnuOptions (), System.out); displayBlankLines (4, System.out); System.out.println ("- HELP -"); printHelp (constructPosixOptions (), 80, "POSIX HELP", "POSIX Help beigas", 3, 5, true, System.out); displayBlankLines (1, System.out); printHelp (constructGnuOptions (), 80, "GNU HELP", "GNU Help beigas", 5, 3, true, System.out); 

Pirmajā ekrāna momentuzņēmumā tiek parādīti rezultāti, kad iepriekš minētais kods tiek izpildīts tieši tā, kā parādīts (ar taisnība nodots abiem printHelp metode, kas norāda, ka opcijas jāiekļauj lietošanas daļā). Otrā ekrāna momentuzņēmums parāda, kas notiek, kad tiek veikts otrais zvans uz printHelp ir nepatiesi nodevis tam, lai opcijas netiktu parādītas.

printUsage un printHelp

printUsage un printHelp ar vienu printHelp neparāda opcijas

Kaut arī informācija par opciju lietošanu un palīdzību ir, kā norāda to nosaukums, noderīga un noderīga, komandrindas argumentu izmantošanas patiesais iemesls parasti ir lietojumprogrammas darbības kontrolēšana. Nākamais kodu saraksts parāda divas GNU stila un Posix stila komandrindas argumentu parsēšanas metodes. Lai gan opciju iestatīšana neuztraucās par konkrēto stilu, izņemot pašu opciju norādīšanu, opciju veids tagad ir svarīgs, lai noteiktu piemēroto parsētāju, kuru izmantot.

usePosixParser () un useGnuParser ()

 / ** * Lietojiet Apache Commons CLI PosixParser komandrindas argumentiem. * * @param commandLineArguments Komandrindas argumenti, kas jāapstrādā ar * Posix stila parsētāju. * / public static void usePosixParser (final String [] commandLineArguments) {final CommandLineParser cmdLinePosixParser = new PosixParser (); galīgās opcijas posixOptions = constructPosixOptions (); CommandLine commandLine; mēģiniet {commandLine = cmdLinePosixParser.parse (posixOptions, commandLineArguments); if (commandLine.hasOption ("display")) {System.out.println ("Jūs vēlaties displeju!"); }} catch (ParseException parseException) // pārbaudīts izņēmums {System.err.println ("Radās izņēmums parsējot, izmantojot PosixParser: \ n" + parseException.getMessage ()); }} / ** * Lietojiet Apache Commons CLI GnuParser komandrindas argumentiem. * * @param commandLineArguments Komandrindas argumenti, kas jāapstrādā ar * Gnu stila parsētāju. * / public static void useGnuParser (final String [] commandLineArguments) {final CommandLineParser cmdLineGnuParser = new GnuParser (); galīgās opcijas gnuOptions = constructGnuOptions (); CommandLine commandLine; mēģiniet {commandLine = cmdLineGnuParser.parse (gnuOptions, commandLineArguments); if (commandLine.hasOption ("p")) {System.out.println ("Jūs vēlaties drukāt (p izvēlēts)!"); } if (commandLine.hasOption ("drukāt")) {System.out.println ("Jūs vēlaties drukāt (druka izvēlēta)!"); } if (commandLine.hasOption ('g')) {System.out.println ("Jūs vēlaties GUI!"); } if (commandLine.hasOption ("n")) {System.out.println ("Jūs izvēlējāties numuru" + commandLine.getOptionValue ("n")); }} catch (ParseException parseException) // pārbaudīts izņēmums {System.err.println ("Parsējot, izmantojot GnuParser, radās izņēmums: \ n" + parseException.getMessage ()); }} 

Kad tiek izpildīts iepriekš minētais kods, tā izeja izskatās tā, kas parādīta nākamajos divos ekrāna momentuzņēmumos:

PosixParser rezultāti

GNU parsētāja rezultāti

Pilnīgs piemērs

Ērtības labad tagad ir norādīts pilns lietojumprogrammas parauga kods, no kura tika rādītas daļas iepriekš.

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