Programavimas

Komandinės eilutės analizavimas naudojant „Apache Commons“ CLI

Kartkartėmis manau, kad man reikia tvarkyti „Java“ komandinės eilutės argumentus „Java“ programoms arba pagrindinėms () funkcijoms įgyvendinti, kurios suteikia paprastą testavimo mechanizmą tiesiogiai bandomoje klasėje. „Java“ kūrėjas turi daug pasirinkimų komandinės eilutės analizavimui. Kai yra tik vienas, du arba nedaug komandinės eilutės argumentų (ypač jei reikalinga žymos buvimas ar nebuvimas, o ne papildoma reikšmė), parašykite kelias eilutes kodo, kad apdorotumėte šias komandų eilutes. linijos variantai nėra didelė problema. Kai yra daugiau parinkčių ir (arba) kai kurios parinktys turi reikšmes, malonu naudotis sudėtingesniu komandinės eilutės analizės palaikymu.

Šiame tinklaraščio įraše apžvelgsiu „Apache Commons“ CLI bibliotekos naudojimą, tačiau yra daugybė kitų pasirinkimų, tokių kaip args4j, TE-Code komandų eilutės analizavimas, CLAJR (komandinės eilutės argumentai su „Java Reflection“), JArgs, JSAP („Simple Simple“) Argumentų procesorius) ir dar keli (čia dar daugiau).

Nors „Apache Commons“ CLI biblioteka yra „Apache Commons“ dalis, tai yra atskiras (JAR) atsisiuntimas iš „Jache“ atsisiuntimo „Apache Commons Modeler“ ir JAR atsisiuntimo „Apache Commons Lang“, apie kuriuos kalbėjau ankstesniuose tinklaraščio įrašuose, kuriuos galite rasti čia ir čia. Šiame tinklaraščio įraše aš naudoju CLI 1.1, nes nėra numatomo CLI 2.0 leidimo (daugiau informacijos apie tai šio įrašo pabaigoje).

Parodysiu keletą labai paprastų „Apache Common CLI“ pavyzdžių ir įtrauksiu keletą nuorodų į kitus šios bibliotekos naudojimo išteklius.

Dvi svarbios „Apache Common CLI“ naudojamos klasės yra org.apache.commons.cli.Option klasė ir glaudžiai susijusios org.apache.commons.cli.Options (yra keli Variantas klasė). Šios klasės naudojamos numatomoms komandinės eilutės parinktims atspindėti. Šie du kodo fragmentai rodo „Options“ klasės nustatymą „Posix“ stiliaus ir „GNU“ stiliaus parinktims.

Parinkčių klasės naudojimas su keliomis pasirinkimo galimybėmis

 / ** * Sukurkite ir pateikite su „Posix“ suderinamas parinktis. * * @return Parinktys laukiamos iš „Posix“ formos komandinės eilutės. * / public static Options constructPosixOptions () {final Options posixOptions = new Options (); posixOptions.addOption („display“, false, „Rodyti būseną“); return posixOptions; } / ** * Sukurkite ir pateikite su GNU suderinamas parinktis. * * @return Parinktys laukiamos iš GNU formos komandinės eilutės. * / public static Options constructGnuOptions () {final Options gnuOptions = new Options (); gnuOptions.addOption („p“, „print“, „false“, „Option for printing“) .addOption („g“, „gui“, false, „HMI option“). addOption („n“, true, „Number of kopijos "); grąžinti „gnuOptions“; } 

„Options“ nustatymo pavyzdžiuose atkreipkite dėmesį, kad dar nėra jokio skirtumo „Posix“ stiliaus ir „GNU“ stiliaus galimybių tvarkyme. Kol kas variantai gali būti traktuojami vienodai.

Prieš pradedant demonstruoti CLI komandinės eilutės argumentų analizavimą remiantis šiomis numatomomis galimybėmis, verta atkreipti dėmesį į CLI palaikymą naudojimo informacijai ir pagalbos informacijai per klasę org.apache.commons.cli.HelpFormatter. Šioje naudingoje naudingumo klasėje yra metodai, tokie kaip perkrautos „printHelp“ versijos, perkrautos „printUsage“ versijos ir keletas kitų išvesties bei susijusių metodų.

Šis kodo fragmentas parodo metodą, kuris naudoja vieną iš „HelpFormatter“ „printUsage“ metodų ir vieną iš šios klasės „printHelp“ metodų.

„printUsage“ () ir „printHelp“ ()

 / ** * Spausdinkite naudojimo informaciją į pateiktą „OutputStream“. * * @param applicationName Programos, kurią norite naudoti, pavadinimas. * @param options Komandų eilutės parinktys yra naudojimo dalis. * @param out OutputStream, kur rašyti naudojimo informaciją. * / public static void printUsage (final String applicationName, final Options options, final OutputStream out) {final PrintWriter rašytojas = new PrintWriter (out); galutinis HelpFormatter useFormatter = naujas HelpFormatter (); useFormatter.printUsage (rašytojas, 80, programos pavadinimas, parinktys); rašytojas.uždaryti (); } / ** * Parašykite „help“ į pateiktą „OutputStream“. * / public static void printHelp (galutinės parinkčių parinktys, galutinė int spausdintaRowWidth, galutinė eilutės antraštė, galutinė eilutės poraštė, galutinės int erdvėsBeforeOption, final int tarpaiBeforeOptionDescription, final boolean displayUsage, final OutputStream out) {final String commandLineSyntax = "java -cp ApacheCommonsCLI. stiklainis "; galutinis „PrintWriter“ rašytojas = naujas „PrintWriter“ (out); galutinis HelpFormatter helpFormatter = new HelpFormatter (); helpFormatter.printHelp (rašytojas, spausdintasRowWidth, commandLineSyntax, antraštė, parinktys, tarpaiBeforeOption, tarpaiBeforeOptionDescription, poraštė, displayUsage); rašytojas.uždaryti (); } 

Kitas kodo fragmentas rodo kai kuriuos iškvietimus į „printHelp“ () ir „printUsage“ (aukščiau pateiktus) metodus, po kurio pateikiama ekrano momentinė kopija, rodanti išvestį iš jų paleidimo.

 System.out.println ("- NAUDOJIMAS -"); printUsage (applicationName + "(Posix)", constructPosixOptions (), System.out); displayBlankLines (1, System.out); printUsage (applicationName + "(Gnu)", constructGnuOptions (), System.out); displayBlankLines (4, System.out); System.out.println ("- PAGALBA -"); printHelp (constructPosixOptions (), 80, "POSIX HELP", "POSIX Help pabaiga", 3, 5, true, System.out); displayBlankLines (1, System.out); printHelp (constructGnuOptions (), 80, "GNU HELP", "GNU žinyno pabaiga", 5, 3, true, System.out); 

Pirmasis ekrano momentinis vaizdas rodo rezultatus, kai aukščiau pateiktas kodas vykdomas tiksliai taip, kaip parodyta (su tiesa perduodama abiem „printHelp“ nurodant, kad parinktys turėtų būti įtrauktos į naudojimo dalį). Antrasis ekrano momentinis vaizdas rodo, kas nutinka, kai paskambinama į „printHelp“ turi klaidingą informaciją, kad parinktys nebūtų rodomos.

„printUsage“ ir „printHelp“

„printUsage“ ir „printHelp“ su vienu printHelp nerodomos parinktys

Nors naudojimo ir pagalbos informacija apie parinktis yra, kaip rodo jų pavadinimai, naudinga ir naudinga, tikroji komandinės eilutės argumentų naudojimo priežastis paprastai yra programos elgesio kontrolė. Kitame kodų sąraše pateikiami du GNU stiliaus ir „Posix“ stiliaus komandinės eilutės argumentų analizės metodai. Nors nustatant parinktis nerūpėjo konkretus stilius, išskyrus pačių parinkčių nurodymą, pasirinkimo tipas yra svarbus dabar, norint nustatyti tinkamą naudojamą analizatorių.

usePosixParser () ir useGnuParser ()

 / ** * Taikykite „Apache Commons“ CLI „PosixParser“ komandinės eilutės argumentams. * * @param commandLineArguments Komandinės eilutės argumentai, kuriuos reikia apdoroti naudojant * Posix stiliaus analizatorių. * / public static void usePosixParser (final String [] commandLineArguments) {final CommandLineParser cmdLinePosixParser = new PosixParser (); final Options posixOptions = constructPosixOptions (); CommandLine commandLine; pabandykite {commandLine = cmdLinePosixParser.parse (posixOptions, commandLineArguments); if (commandLine.hasOption ("rodyti")) {System.out.println ("Norite ekrano!"); }} catch (ParseException parseException) // patikrinta išimtis {System.err.println ("Aptikta išimtis analizuojant naudojant PosixParser: \ n" + parseException.getMessage ()); }} / ** * Komandų eilutės argumentams pritaikykite „Apache Commons“ CLI „GnuParser“. * * @param commandLineArguments Komandinės eilutės argumentai, kuriuos reikia apdoroti naudojant * Gnu stiliaus analizatorių. * / public static void useGnuParser (final String [] commandLineArguments) {final CommandLineParser cmdLineGnuParser = new GnuParser (); galutinės parinktys gnuOptions = constructGnuOptions (); CommandLine commandLine; pabandykite {commandLine = cmdLineGnuParser.parse (gnuOptions, commandLineArguments); if (commandLine.hasOption ("p")) {System.out.println ("Norite spausdinti (pasirinkta p)!"); } if (commandLine.hasOption ("spausdinti")) {System.out.println ("Norite spausdinti (spausdinti pasirinkta)!"); } if (commandLine.hasOption ('g')) {System.out.println ("Norite GUI!"); } if (commandLine.hasOption ("n")) {System.out.println ("Jūs pasirinkote skaičių" + commandLine.getOptionValue ("n")); }} catch (ParseException parseException) // patikrinta išimtis {System.err.println ("Aptikta išimtis analizuojant naudojant GnuParser: \ n" + parseException.getMessage ()); }} 

Vykdžius minėtą kodą, jo išvestis atrodo tokia, kokia parodyta kitose dviejose ekrano nuotraukose:

„PosixParser“ rezultatai

GNU analizatoriaus rezultatai

Pilnas pavyzdys

Pilnas programos pavyzdžio, iš kurio dalys buvo parodytos aukščiau, kodas dabar yra pateiktas patogumo sumetimais.