Ohjelmointi

Komentorivin jäsentäminen Apache Commonsin CLI: n avulla

Aika ajoin tarvitsen käsittelevän komentoriviargumentteja Javassa joko Java-pohjaisiin sovelluksiin tai pääfunktiototeutuksiin (), jotka tarjoavat yksinkertaisen testausmekanismin suoraan testattavassa luokassa. Java-kehittäjällä on monia vaihtoehtoja komentorivin jäsentämiseen. Kun komentoriviargumentteja on vain yksi, kaksi tai pieni määrä (varsinkin jos tarvitaan vain lipun läsnäolo tai puuttuminen lisäarvon sijasta), kirjoita muutama koodirivi näiden komento- linjavaihtoehdot eivät ole iso juttu. Kun vaihtoehtoja on enemmän ja / tai joillakin vaihtoehdoilla on arvoja, on mukavaa käyttää kehittyneempää tukea komentorivin jäsentämiseen.

Tässä blogikirjoituksessa tarkastelen Apache Commons CLI -kirjaston käyttöä, mutta on olemassa lukuisia muita vaihtoehtoja, kuten args4j, TE-Code-komentorivin jäsentäminen, CLAJR (komentoriviargumentit Java-heijastuksella), JArgs, JSAP (Java Simple) Argument Processor) ja useita muita (vielä enemmän täällä).

Vaikka Apache Commonsin CLI-kirjasto on osa Apache Commonsia, se on erillinen (JAR) lataus Apache Commons Modeler -sovelluksen JAR-latauksesta ja Apache Commons Langin JAR-latauksesta, josta puhuin edellisissä täällä ja täällä olevissa blogimerkinnöissä. Tässä blogimerkinnässä käytän CLI 1.1: tä, koska CLI 2.0: lle ei ole odotettua julkaisua (lisätietoja tästä merkinnän lopussa).

Esittelen joitain hyvin yksinkertaisia ​​esimerkkejä Apache Common CLI: stä ja sisällytän linkkejä muihin tämän kirjaston käytön resursseihin.

Kaksi tärkeää luokkaa Apache Common CLI: n käytössä ovat org.apache.commons.cli.Option-luokka ja siihen läheisesti liittyvät org.apache.commons.cli.Options (sisältää useita Vaihtoehto luokka). Näitä luokkia käytetään edustamaan odotettuja komentorivivalintoja. Seuraavat kaksi koodinpätkää osoittavat Asetukset-luokan perustamisen Posix-tyylisille vaihtoehdoille ja GNU-tyylisille vaihtoehdoille.

Vaihtoehtoluokan käyttäminen useiden vaihtoehtoesimerkkien kanssa

 / ** * Rakenna ja tarjoa Posix-yhteensopivia vaihtoehtoja. * * @return Vaihtoehdot odotetaan Posix-lomakkeen komentoriviltä. * / public static Options constructPosixOptions () {final Options posixOptions = new Options (); posixOptions.addOption ("display", false, "Näytä tila"); return posixOptions; } / ** * Rakenna ja tarjoa GNU-yhteensopivia vaihtoehtoja. * * @return Asetuksia odotetaan GNU-lomakkeen komentoriviltä. * / public static Options constructGnuOptions () {final Options gnuOptions = new Options (); gnuOptions.addOption ("p", "tulosta", epätosi, "Tulostusvaihtoehto"). addOption ("g", "gui", epätosi, "HMI-vaihtoehto"). addOption ("n", tosi, " kopiot "); return gnuOptions; } 

Huomaa Options-asetusten esimerkeissä, että Posix-tyylisten ja GNU-tyylisten vaihtoehtojen käsittelyssä ei ole vielä eroa. Toistaiseksi vaihtoehtoja voidaan kohdella samalla tavalla.

Ennen kuin siirrytään osoittamaan CLI: n komentoriviargumenttien jäsentäminen näiden odotettujen vaihtoehtojen perusteella, on syytä huomata CLI: n tuki käyttötiedoille ja ohjetiedoille org.apache.commons.cli.HelpFormatter-luokan kautta. Tämä hyödyllinen apuohjelmaluokka sisältää menetelmiä, kuten printHelpin ylikuormitetut versiot, printUsage-ohjelmiston ylikuormitetut versiot ja useita muita tulosteita ja niihin liittyviä menetelmiä.

Seuraava koodinpätkä osoittaa menetelmän, joka käyttää yhtä HelpFormatterin printUsage-menetelmistä ja yhtä kyseisen luokan printHelp-menetelmistä.

printUsage () ja printHelp ()

 / ** * Tulosta käyttötiedot toimitettuun OutputStreamiin. * * @param applicationName Käytössä luetteloitavan sovelluksen nimi. * @param options Komentorivivalinnat osaksi käyttöä. * @param out OutputStream, johon käyttötiedot kirjoitetaan. * / public static void printUsage (viimeinen merkkijonosovelluksen nimi, lopulliset vaihtoehtovaihtoehdot, lopullinen OutputStream out) {lopullinen PrintWriter-kirjoittaja = uusi PrintWriter (ulos); lopullinen HelpFormatter useFormatter = uusi HelpFormatter (); useFormatter.printUsage (kirjoittaja, 80, sovelluksenNimi, vaihtoehdot); kirjailija.sulje (); } / ** * Kirjoita "ohje" annettuun OutputStreamiin. * / public static void printHelp (lopulliset asetukset -vaihtoehdot, lopullinen int painettuRowWidth, viimeinen merkkijono-otsikko, viimeinen merkkijono-alatunniste, viimeiset int-välilyönnitBeforeOption, viimeiset int-tilatBeforeOptionDescription, viimeinen boolen näyttöUsage, lopullinen OutputStream out) {lopullinen merkkijono commandLineSyntax = "java -cp ApacheCommonsCLI. purkki "; lopullinen PrintWriter-kirjoittaja = uusi PrintWriter (ulos); viimeinen HelpFormatter helpFormatter = new HelpFormatter (); helpFormatter.printHelp (kirjoittaja, painettuRowWidth, commandLineSyntax, otsikko, asetukset, välilyönnit, välilyönnit, välilyönnit, alatunniste, displayUsage); kirjailija.sulje (); } 

Seuraava koodinpätkä näyttää joitain kutsuja yllä esitettyihin printHelp () - ja printUsage () -menetelmiin, ja sitä seuraa näytön tilannekuva, joka näyttää niiden suorittamisen tuloksen.

 System.out.println ("- KÄYTTÖ -"); printUsage (sovelluksenNimi + "(Posix)", constructPosixOptions (), System.out); displayBlankLines (1, System.out); printUsage (sovelluksenNimi + "(Gnu)", constructGnuOptions (), System.out); displayBlankLines (4, System.out); System.out.println ("- HELP -"); printHelp (constructPosixOptions (), 80, "POSIX HELP", "POSIX-ohjeen loppu", 3, 5, true, System.out); displayBlankLines (1, System.out); printHelp (constructGnuOptions (), 80, "GNU HELP", "GNU-ohjeen loppu", 5, 3, true, System.out); 

Ensimmäinen näytön tilannekuva näyttää tulokset, kun yllä oleva koodi suoritetaan täsmälleen kuten kuvassa ( totta välitetään printHelp osoittaa, että vaihtoehdot tulisi sisällyttää käyttöosaan). Toinen näyttökuva näyttää, mitä tapahtuu, kun toinen puhelu soitetaan printHelp on antanut sille väärän arvon, joten vaihtoehtoja ei näytetä.

printUsage ja printHelp

printUsage and printHelp with one printHelp ei näytä asetuksia

Vaikka vaihtoehtojen käyttö- ja ohjetiedot ovat nimiensä mukaan hyödyllisiä ja hyödyllisiä, todellinen syy komentoriviargumenttien käyttämiseen on yleensä sovelluksen käyttäytymisen hallinta. Seuraava koodiluettelo näyttää kaksi tapaa jäsentää GNU-tyylisiä ja Posix-tyylisiä komentoriviargumentteja. Vaikka Asetusten määrittäminen ei välittänyt tietystä tyylistä paitsi itse asetusten määrittämisestä, vaihtoehtotyyppi on nyt tärkeä määritettäessä sopiva jäsennin käytettäväksi.

usePosixParser () ja useGnuParser ()

 / ** * Käytä Apache Commons CLI PosixParseria komentoriviargumentteihin. * * @param commandLineArguments * Posix-tyylisen jäsentimen kanssa käsiteltävät komentoriviargumentit. * / public static void usePosixParser (viimeinen merkkijono [] commandLineArguments) {lopullinen CommandLineParser cmdLinePosixParser = uusi PosixParser (); final Options posixOptions = constructPosixOptions (); CommandLine commandLine; kokeile {commandLine = cmdLinePosixParser.parse (posixOptions, commandLineArguments); if (commandLine.hasOption ("näyttö")) {System.out.println ("Haluat näytön!"); }} catch (ParseException parseException) // tarkastettu poikkeus {System.err.println ("Havaittu poikkeus jäsennettäessä PosixParser-sovelluksen avulla: \ n" + parseException.getMessage ()); }} / ** * Käytä Apache Commons CLI GnuParseria komentoriviargumentteihin. * * @param commandLineArguments * Gnu-tyylisen jäsentimen kanssa käsiteltävät komentoriviargumentit. * / public static void useGnuParser (viimeinen merkkijono [] commandLineArguments) {lopullinen CommandLineParser cmdLineGnuParser = uusi GnuParser (); lopulliset asetukset gnuOptions = constructGnuOptions (); CommandLine commandLine; kokeile {commandLine = cmdLineGnuParser.parse (gnuOptions, commandLineArguments); if (commandLine.hasOption ("p")) {System.out.println ("Haluat tulostaa (p valittu)!"); } if (commandLine.hasOption ("tulosta")) {System.out.println ("Haluat tulostaa (tulostus valittu)!"); } if (commandLine.hasOption ('g')) {System.out.println ("Haluat GUI: n!"); } if (commandLine.hasOption ("n")) {System.out.println ("Valitsit numeron" + commandLine.getOptionValue ("n")); }} catch (ParseException parseException) // tarkastettu poikkeus {System.err.println ("Havaittu poikkeus jäsennettäessä GnuParser-sovelluksen avulla: \ n" + parseException.getMessage ()); }} 

Kun yllä oleva koodi suoritetaan, sen lähtö näyttää samalta kuin seuraavissa kahdessa näytön tilannekuvassa:

PosixParser-tulokset

GNU-jäsennintulokset

Täydellinen esimerkki

Täydellinen koodi esimerkkisovellukselle, josta osia esitettiin edellä, on nyt lueteltu mukavuuden vuoksi.