Programiranje

Razčlenjevanje ukazne vrstice z Apache Commons CLI

Občasno se mi zdi, da moram v Javi obdelovati argumente ukazne vrstice bodisi za aplikacije, ki temeljijo na Javi, bodisi za izvedbe funkcije main (), ki zagotavljajo preprost preskusni mehanizem neposredno znotraj preizkušenega razreda. Razvijalec Java ima veliko možnosti za razčlenjevanje ukazne vrstice. Če je samo en, dva ali majhno število argumentov ukazne vrstice (še posebej, če je prisotnost ali odsotnost zastavice vse, kar je potrebno, ne pa spremna vrednost), napišite nekaj vrstic kode za obdelavo teh linijske možnosti ni velika stvar. Ko je več možnosti in / ali nekatere možnosti imajo vrednosti, je lepo dostopati do bolj izpopolnjene podpore za razčlenjevanje ukazne vrstice.

V tem prispevku si bom ogledal uporabo knjižnice CLI Apache Commons, vendar obstajajo številne druge možnosti, kot so args4j, razčlenjevanje ukazne vrstice TE-Code, CLAJR (argumenti ukazne vrstice z odsevom Java), JArgs, JSAP (Java Simple Argument Processor) in več drugih (še več tukaj).

Čeprav je knjižnica Apache Commons CLI del Apache Commons, gre za ločen prenos (JAR) od prenosa JAR za Apache Commons Modeler in od prenosa JAR za Apache Commons Lang, o katerem sem govoril v prejšnjih vnosih v spletni dnevnik, ki so na voljo tukaj in tukaj. Za ta vnos v blogu uporabljam CLI 1.1, ker za CLI 2.0 ni predvidene izdaje (več podrobnosti o tem na koncu tega vnosa).

Predstavil bom nekaj zelo preprostih primerov Apache Common CLI in vključil nekaj povezav do drugih virov o uporabi te knjižnice.

Dva pomembna razreda, ki uporabljata Apache Common CLI, sta razred org.apache.commons.cli.Option in tesno povezan org.apache.commons.cli.Options (vsebuje več primerov Možnost razred). Ti razredi se uporabljajo za predstavitev pričakovanih možnosti ukazne vrstice. Naslednja dva delčka kode prikazujeta nastavitev razreda Options za možnosti v slogu Posix in GNU.

Uporaba razreda možnosti z več primerki možnosti

 / ** * Izdelajte in zagotovite možnosti, združljive s Posix. * * @return Možnosti, pričakovane iz ukazne vrstice obrazca Posix. * / javne statične možnosti constructPosixOptions () {končne možnosti posixOptions = nove možnosti (); posixOptions.addOption ("display", false, "Display the state."); vrni posixOptions; } / ** * Sestavite in zagotovite možnosti, združljive z GNU. * * @return Možnosti, pričakovane iz ukazne vrstice obrazca GNU. * / javne statične možnosti constructGnuOptions () {končne možnosti gnuOptions = nove možnosti (); gnuOptions.addOption ("p", "print", false, "Možnost tiskanja") .addOption ("g", "gui", false, "HMI option") .addOption ("n", true, "Število kopije "); vrni gnuOptions; } 

V primerih nastavitve možnosti opazite, da pri ravnanju z možnostmi v slogu Posix in GNU še ni razlike. Zaenkrat lahko možnosti obravnavamo enako.

Preden začnemo s prikazom razčlenjevanja argumentov ukazne vrstice na osnovi predvidenih možnosti, je treba opozoriti na podporo CLI za informacije o uporabi in informacije o pomoči prek razreda org.apache.commons.cli.HelpFormatter. Ta uporaben razred koristnosti vsebuje metode, kot so preobremenjene različice printHelp, preobremenjene različice printUsage in več drugih izhodnih in sorodnih metod.

Naslednji delček kode prikazuje metodo, ki uporablja eno od metod PrintUsage HelpFormatterja in eno od metod printHelp tega razreda.

printUsage () in printHelp ()

 / ** * Natisnite informacije o uporabi na priloženi OutputStream. * * @param applicationName Ime aplikacije za seznam v uporabi. * @param options Možnosti ukazne vrstice, ki bodo del uporabe. * @param ven OutputStream, kamor želite zapisati podatke o uporabi. * / public static void printUsage (končni String applicationName, končne možnosti možnosti, končni OutputStream out) {final PrintWriter Writer = nov PrintWriter (out); končni HelpFormatter usageFormatter = nov HelpFormatter (); useFormatter.printUsage (zapisovalnik, 80, ApplicationName, možnosti); writer.close (); } / ** * V priloženi OutputStream napišite "pomoč". * / public static void printHelp (končne možnosti možnosti, končni int printRowWidth, končna glava niza, končna noga niza, končni int presledkiBeforeOption, končni int presledkiBeforeOptionDescription, končni logični prikazUsage, končni OutputStream out) {final String commandLineSyntax = "java -cp ApacheCommonsCL. kozarec "; končni pisatelj PrintWriter = nov PrintWriter (ven); končni HelpFormatter helpFormatter = nov HelpFormatter (); helpFormatter.printHelp (zapisovalnik, PrintRowWidth, commandLineSyntax, glava, možnosti, spaceBeforeOption, presledkiBeforeOptionDescription, noga, displayUsage); writer.close (); } 

Naslednji delček kode prikazuje nekaj klicev zgoraj prikazanih metod printHelp () in printUsage (), čemur sledi posnetek zaslona, ​​ki prikazuje izhod iz izvajanja teh.

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

Prvi posnetek zaslona prikazuje rezultate, ko se zgornja koda izvede natančno tako, kot je prikazano (z prav preneseno na obe uporabi printHelp metoda, ki označuje, da je treba v del uporabe vključiti možnosti). Posnetek drugega zaslona prikazuje, kaj se zgodi ob drugem klicu printHelp je false prenesla vanj, tako da možnosti niso prikazane.

printUsage in printHelp

printUsage in printHelp z enim printHelp Možnosti niso prikazane

Čeprav so informacije o uporabi in pomoči o možnostih, kot že povejo njihova imena, koristne in koristne, je pravi razlog za uporabo argumentov ukazne vrstice običajno nadzor vedenja aplikacije. Naslednji seznam kode prikazuje dva načina za razčlenitev argumentov ukazne vrstice v slogu GNU in Posix. Medtem ko pri nastavitvi Možnosti ni skrbelo za določen slog, razen za določanje samih možnosti, je vrsta možnosti zdaj pomembna za določitev primernega razčlenjevalnika, ki ga želite uporabiti.

usePosixParser () in useGnuParser ()

 / ** * Uporabite Apache Commons CLI PosixParser za argumente ukazne vrstice. * * @param commandLineArguments Argumenti ukazne vrstice, ki jih je treba obdelati z razčlenjevalnikom v slogu * Posix. * / javna statična praznina usePosixParser (končni niz [] commandLineArguments) {final CommandLineParser cmdLinePosixParser = nov PosixParser (); končne možnosti posixOptions = constructPosixOptions (); CommandLine commandLine; poskusite {commandLine = cmdLinePosixParser.parse (posixOptions, commandLineArguments); if (commandLine.hasOption ("display")) {System.out.println ("Hočeš prikaz!"); }} catch (ParseException parseException) // preverjena izjema {System.err.println ("Naletela na izjemo med razčlenjevanjem s pomočjo PosixParser: \ n" + parseException.getMessage ()); }} / ** * Uporabi Apache Commons CLI GnuParser za argumente ukazne vrstice. * * @param commandLineArguments Argumenti ukazne vrstice, ki jih je treba obdelati z razčlenjevalnikom v slogu * Gnu. * / javna statična void useGnuParser (končni niz [] commandLineArguments) {final CommandLineParser cmdLineGnuParser = nov GnuParser (); končne možnosti gnuOptions = constructGnuOptions (); CommandLine commandLine; poskusite {commandLine = cmdLineGnuParser.parse (gnuOptions, commandLineArguments); if (commandLine.hasOption ("p")) {System.out.println ("Želite tiskati (p izbran)!"); } if (commandLine.hasOption ("print")) {System.out.println ("Želite tiskati (izbrani izpis)!"); } if (commandLine.hasOption ('g')) {System.out.println ("Hočeš GUI!"); } if (commandLine.hasOption ("n")) {System.out.println ("Izbrali ste številko" + commandLine.getOptionValue ("n")); }} catch (ParseException parseException) // preverjena izjema {System.err.println ("Naletela na izjemo med razčlenjevanjem z GnuParser: \ n" + parseException.getMessage ()); }} 

Ko se zgornja koda izvede, je njen izhod videti kot prikazan na naslednjih dveh posnetkih zaslona:

Rezultati PosixParser

Rezultati razčlenjevalnika GNU

Popoln primer

Za udobje je zdaj navedena celotna koda za primer aplikacije, iz katere so bili prikazani deli zgoraj.

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