Programování

Analýza příkazového řádku s rozhraním Apache Commons CLI

Čas od času zjistím, že potřebuji zpracovat argumenty příkazového řádku v Javě buď pro aplikace založené na Javě, nebo pro implementace funkcí main (), které poskytují jednoduchý testovací mechanismus přímo v testované třídě. Vývojář Java má mnoho možností pro analýzu příkazového řádku. Pokud existuje pouze jeden, dva nebo malý počet argumentů příkazového řádku (zejména pokud je potřeba přítomnost nebo nepřítomnost příznaku, spíše než doprovodná hodnota), napište několik řádků kódu ke zpracování těchto příkazů možnosti linky není velký problém. Pokud existuje více možností a / nebo některé možnosti mají hodnoty, je hezké získat přístup ke sofistikovanější podpoře analýzy příkazového řádku.

V této položce blogu se podívám na používání knihovny Apache Commons CLI, ale existuje řada dalších možností, jako je args4j, analýza příkazového řádku TE-Code, CLAJR (Argumenty příkazového řádku s Java Reflection), JArgs, JSAP (Java Simple Argument Processor) a několik dalších (ještě více zde).

Přestože je knihovna CLI Apache Commons součástí Apache Commons, jedná se o samostatné stahování (JAR) ze souboru JAR pro Apache Commons Modeler a ze souboru JAR pro Apache Commons Lang, o kterém jsem hovořil v předchozích položkách blogu, které jsou k dispozici zde a zde. Pro tuto položku blogu používám rozhraní CLI 1.1, protože pro CLI 2.0 neexistuje žádné očekávané vydání (další podrobnosti najdete na konci této položky).

Ukážu několik velmi jednoduchých příkladů rozhraní Apache Common CLI a uvedu odkazy na další zdroje týkající se používání této knihovny.

Dvě důležité třídy používané při používání rozhraní Apache Common CLI jsou třída org.apache.commons.cli.Option a úzce související org.apache.commons.cli.Options (obsahuje více instancí Volba třída). Tyto třídy se používají k reprezentaci očekávaných možností příkazového řádku. Následující dva fragmenty kódu ukazují nastavení třídy Options pro možnosti ve stylu Posix a možnosti ve stylu GNU.

Použití třídy možností s více instancemi možností

 / ** * Vytvořte a poskytněte možnosti kompatibilní s Posix. * * @return Možnosti očekávané z příkazového řádku formuláře Posix. * / public static Options constructPosixOptions () {final Options posixOptions = new Options (); posixOptions.addOption ("display", false, "Display the state."); vrátit posixOptions; } / ** * Vytvořte a poskytněte možnosti kompatibilní s GNU. * * @return Možnosti očekávané z příkazového řádku formuláře GNU. * / public static Options constructGnuOptions () {final Options gnuOptions = new Options (); gnuOptions.addOption ("p", "print", false, "Možnost tisku") .addOption ("g", "gui", false, "možnost HMI") .addOption ("n", true, "Počet kopie "); vrátit gnuOptions; } 

V příkladech nastavení voleb si všimněte, že zatím není žádný rozdíl ve zpracování možností ve stylu Posix oproti možnostem ve stylu GNU. Zatím lze s možnostmi zacházet stejně.

Před přechodem na demonstraci analýzy příkazových řádků argumentů příkazového řádku na základě těchto očekávaných možností je třeba si povšimnout podpory CLI pro informace o použití a informace nápovědy prostřednictvím třídy org.apache.commons.cli.HelpFormatter. Tato užitečná třída nástrojů obsahuje metody, jako jsou přetížené verze printHelp, přetížené verze printUsage a několik dalších výstupů a souvisejících metod.

Následující fragment kódu ukazuje metodu, která využívá jednu z metod PrintUsage HelpFormatter a jednu z metod printHelp dané třídy.

printUsage () a printHelp ()

 / ** * Vytiskněte informace o využití na poskytnutý OutputStream. * * @param applicationName Název aplikace, která má být uvedena v seznamu použití. * @param options Možnosti příkazového řádku, které mají být součástí použití. * @param out OutputStream, do kterého se zapisují informace 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 (); } / ** * Napište „help“ do poskytnutého OutputStream. * / public static void printHelp (finální možnosti voleb, finální int printRowWidth, finální hlavička řetězce, finální zápatí řetězce, finální int mezeryBeforeOption, finální int mezeryBeforeOptionDescription, finální boolean displayUsage, finální výstup OutputStream) {final String commandLineSyntax = "java -cp ApacheCommonsCLI. sklenice"; finální zapisovač PrintWriter = nový PrintWriter (out); final HelpFormatter helpFormatter = nový HelpFormatter (); helpFormatter.printHelp (zapisovatel, printedRowWidth, commandLineSyntax, záhlaví, možnosti, spacesBeforeOption, spacesBeforeOptionDescription, zápatí, displayUsage); writer.close (); } 

Následující fragment kódu ukazuje některá volání metod printHelp () a printUsage () uvedených výše a následuje snímek obrazovky zobrazující výstup z jejich spuštění.

 System.out.println ("- POUŽITÍ -"); printUsage (applicationName + "(Posix)", constructPosixOptions (), System.out); displayBlankLines (1, System.out); printUsage (applicationName + "(Gnu)", constructGnuOptions (), System.out); displayBlankLines (4, System.out); System.out.println ("- NÁPOVĚDA -"); 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); 

První snímek obrazovky ukazuje výsledky, když se výše uvedený kód provede přesně tak, jak je znázorněno (s skutečný předán oběma účelům printHelp metoda označující, že možnosti by měly být zahrnuty do části použití). Druhý snímek obrazovky ukazuje, co se stane při druhém volání printHelp má false předán, takže možnosti nejsou zobrazeny.

printUsage a printHelp

printUsage a printHelp s One printHelp Nezobrazuje možnosti

Zatímco informace o použití a nápovědě k možnostem jsou, jak jejich názvy naznačují, užitečné a užitečné, skutečným důvodem použití argumentů příkazového řádku je obvykle ovládání chování aplikace. Následující výpis kódu ukazuje dvě metody pro analýzu argumentů příkazového řádku ve stylu GNU a Posix. Zatímco nastavení voleb se nestaralo o konkrétní styl kromě specifikování samotných voleb, typ volby je nyní důležitý pro určení vhodného analyzátoru, který se má použít.

usePosixParser () a useGnuParser ()

 / ** * Použijte Apache Commons CLI PosixParser na argumenty příkazového řádku. * * @param commandLineArguments Argumenty příkazového řádku, které mají být zpracovány pomocí analyzátoru * Posix-style. * / public static void usePosixParser (final String [] commandLineArguments) {final CommandLineParser cmdLinePosixParser = nový PosixParser (); konečné možnosti posixOptions = constructPosixOptions (); CommandLine commandLine; try {commandLine = cmdLinePosixParser.parse (posixOptions, commandLineArguments); if (commandLine.hasOption ("display")) {System.out.println ("Chcete displej!"); }} catch (ParseException parseException) // zkontrolovala výjimku {System.err.println ("Vyskytla se výjimka při analýze pomocí PosixParser: \ n" + parseException.getMessage ()); }} / ** * Aplikujte Apache Commons CLI GnuParser na argumenty příkazového řádku. * * @param commandLineArguments Argumenty příkazového řádku, které mají být zpracovány pomocí analyzátoru * Gnu-style. * / public static void useGnuParser (final String [] commandLineArguments) {final CommandLineParser cmdLineGnuParser = nový GnuParser (); konečné možnosti gnuOptions = constructGnuOptions (); CommandLine commandLine; try {commandLine = cmdLineGnuParser.parse (gnuOptions, commandLineArguments); if (commandLine.hasOption ("p")) {System.out.println ("Chcete tisknout (p zvoleno)!"); } if (commandLine.hasOption ("print")) {System.out.println ("Chcete tisknout (vybraný tisk)!"); } if (commandLine.hasOption ('g')) {System.out.println ("Chcete GUI!"); } if (commandLine.hasOption ("n")) {System.out.println ("Vybrali jste číslo" + commandLine.getOptionValue ("n")); }} catch (ParseException parseException) // zkontrolovala výjimku {System.err.println ("Vyskytla se výjimka při analýze pomocí GnuParser: \ n" + parseException.getMessage ()); }} 

Když je spuštěn výše uvedený kód, jeho výstup vypadá jako ten, který je zobrazen v následujících dvou snímcích obrazovky: When the above code is executed, its output looks like that shown in the next two screen snapshots:

Výsledky PosixParser

Výsledky analyzátoru GNU

Úplný příklad

Kompletní kód ukázkové aplikace, ze které se výše ukázaly části, je nyní uveden pro pohodlí.

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