Parancssori paraméterek elemzése a légitársasággal

1. Bemutatkozás

Ebben az oktatóanyagban bemutatjuk az Airline-t - egy annotációval vezérelt Java könyvtárat a parancssori interfészek (CLI) építéséhez.

2. Forgatókönyv

Parancssori alkalmazás létrehozásakor természetes, hogy létrehozunk egy egyszerű felületet, amely lehetővé teszi a felhasználó számára, hogy szükség szerint formázza a kimenetet. Szinte mindenki játszott a Git CLI-vel, és elmondhatja, milyen hatalmas, mégis egyszerű. Sajnos, kevés eszköz jól jön egy ilyen felület felépítésekor.

A légitársaságcélja a Java-ban jellemzően a CLI-khez társított kazánlap kódjának csökkentése, mivel a leggyakoribb viselkedés annotációkkal és nulla felhasználói kóddal érhető el.

Meg fogunk valósítani egy kis Java programot, amely kihasználja az Airline funkcióit, hogy utánozza a közös CLI-t. Felhasználói parancsokat tesz közzé a programkonfigurációnk beállításához, például az adatbázis URL-jének, a hitelesítő adatoknak és a naplózó sokszínűségének meghatározásához. Bemerülünk könyvtárunk felszíne alá is, és az alapjainál többet használunk arra, hogy megvizsgáljuk, ha képes kezelni valamilyen bonyolultságot.

3. Beállítás

A kezdéshez adjuk hozzá a légitársaság függőségét pom.xml:

 com.github.rvesse légitársaság 2.7.2 

4. Egyszerű CLI

Hozzuk létre az alkalmazás belépési pontját - a Parancs sor osztály:

@Cli (name = "baeldung-cli", description = "Baeldung Airline Tutorial", defaultCommand = Help.class) public class CommandLine {public static void main (String [] args) {Cli cli = new Cli (CommandLine.class) ; Futható cmd = cli.parse (arg); cmd.run (); }}

Egy egyszerű @Cli annotációval definiáltuk az alapértelmezett parancsot, amely az alkalmazásunkon fog futni Segítség parancs.

A Segítség osztály az Airline könyvtár részeként érkezik, és egy alapértelmezett súgóparancsot tesz elérhetővé -h vagy -Segítség opciók.

Csakúgy, az alapbeállítás elkészült.

5. Első parancsnokságunk

Végezzük el az első, egyszerű parancsunkat LoggingCommand osztály, amely ellenőrzi a naplóink ​​részletességét. Megjegyezzük az osztályt @Parancs annak biztosítása, hogy a felhasználó hívásakor a megfelelő parancsot alkalmazzák setup-napló:

@Command (név = "setup-log", description = "A naplónk beállítása") public class LoggingCommand a Runnable {@Inject private HelpOption súgóját valósítja meg; @Option (név = {"-v", "--verbose"}, description = "A naplóbeállítás be- és kikapcsolása") private boolean verbose = false; @Orride public void run () {if (! Help.showHelpIfRequested ()) System.out.println ("Bőbeszédűség:" + részletes); }}}

Vizsgáljuk meg közelebbről a példaparancsunkat.

Először állítottunk le egy leírást, hogy segítőnk az injekciónak köszönhetően megjelenítse a parancsopcióinkat, amikor felkérik.

Aztán kijelentettük a logikai változó, bőbeszédű, és azzal jelölte meg @Választási lehetőség nevet, leírást és álnevet adni neki -v / –verbose hogy bemutassuk a parancssori opciót a bőbeszédűség ellenőrzésére.

Végül a fuss módszerrel utasítottuk a parancsunkat, hogy állítsuk le, amikor a felhasználó segítséget kér.

Eddig jó. Most hozzá kell adnunk az új parancsunkat a fő felülethez a @ módosításával.Kliens kommentár:

@Cli (name = "baeldung-cli", description = "Baeldung Airline Tutorial", defaultCommand = Help.class, commands = {LoggingCommand.class, Help.class}) public class CommandLine {public static void main (String [] args ) {Cli cli = új kliens (CommandLine.class); Futható cmd = cli.parse (arg); cmd.run (); }} 

Most, ha elhaladunk setup-log -v a programunkhoz, ez futtatja a logikánkat.

6. Korlátozások és egyebek

Láttuk, hogy az Airline hibátlanul generálja a CLI-t, de ... még több van!

Megadhatunk korlátokat (vagy korlátozásokat) a paramétereink számára az engedélyezett értékek, követelmények vagy függőségek kezelésére és még sok minden másra.

Létrehozunk egy DatabaseSetupCommand osztály, amely válaszolni fog a setup-db parancs; ugyanaz, mint korábban, de adunk hozzá némi fűszert.

Először az adatbázis típusát kérjük, és csak 3 érvényes értéket fogadunk el @AllowedRawValues:

@AllowedRawValues ​​(allowedValues ​​= {"mysql", "postgresql", "mongodb"}) @Option (type = OptionType.COMMAND, name = {"-d", "--database"}, description = "Az RDBMS típusa. ", title =" RDBMS típus: mysql | postgresql | mongodb ") védett karakterlánc rdbmsMode;

Az adatbázis-kapcsolat használatakor minden kétséget kizáróan a felhasználóknak meg kell adniuk egy végpontot és néhány hitelesítő adatot a hozzáféréshez. Hagyjuk, hogy a CLI kezelje ezt az egyiket (URL mód) vagy több paraméter (gazdagép mód). Ehhez a @MutuallyExclusiveWith kommentár, minden paraméter azonos címkével jelölve:

@Option (type = OptionType.COMMAND, name = {"--rdbms: url", "--url"}, description = "Az RDBMS-hez való kapcsolódáshoz használandó URL", title = "RDBMS URL") @MutuallyExclusiveWith ( tag = "mode") @Pattern (pattern = "^ (//.*) :( d *) (. *) u = (. *) & p = (. *)") védett karakterlánc rdbmsUrl = ""; @Option (type = OptionType.COMMAND, name = {"--rdbms: host", "--host"}, description = "Az RDBMS-hez való kapcsolódáshoz használandó gazdagép", title = "RDBMS gazdagép") @MutuallyExclusiveWith ( tag = "mode") védett karakterlánc rdbmsHost = ""; 

Vegye figyelembe, hogy a @Minta dekoratőr, amely segít meghatározni az URL karakterlánc formátumát.

Ha megnézzük a projekt dokumentációját, találunk másokat is értékes eszközök a követelmények, előfordulások, megengedett értékek, egyedi esetek és egyebek kezelésére, amelyek lehetővé teszik számunkra, hogy meghatározzuk egyéni szabályainkat.

Végül, ha a felhasználó a gazdagép módot választotta, akkor meg kell kérnünk őket, hogy adják meg hitelesítő adataikat. Ily módon az egyik lehetőség függ a másiktól. Ezt a viselkedést a @RequiredOnlyIf kommentár:

@RequiredOnlyIf (names = {"- rdbms: host", "--host"}) @Option (type = OptionType.COMMAND, name = {"--rdbms: user", "-u", "--user "}, description =" Felhasználó az RDBMS-be való bejelentkezéshez. ", title =" RDBMS felhasználó ") védett karakterlánc rdbmsUser; @RequiredOnlyIf (names = {"- rdbms: host", "--host"}) @Option (type = OptionType.COMMAND, name = {"--rdbms: password", "--password"}, description = "Jelszó az RDBMS rendszerbe történő bejelentkezéshez.", Title = "RDBMS jelszó") védett karakterlánc rdbmsPassword; 

Mi van, ha néhány illesztőprogramot kell használnunk a DB kapcsolat kezeléséhez? Tegyük fel, hogy egynél több értéket is meg kell kapnunk egyetlen paraméterben. Csak módosíthatjuk az opció típusát OptionType.ARGUMENTS vagy - még jobb - elfogadja az értékek listáját:

@Option (type = OptionType.COMMAND, name = {"--driver", "--jars"}, description = "Illesztőprogramok listája", title = "--driver --driver") védett lista tégelyek = új ArrayList ();

Most ne felejtsük el hozzáadni az adatbázis beállítás parancsot a fő osztályunkhoz. Ellenkező esetben nem lesz elérhető a CLI-n.

7. Fuss

Megcsináltuk! Befejeztük a projektünket, és most futtathatjuk.

A várakozásoknak megfelelően, paraméterek átadása nélkül, Segítség hívják:

$ baeldung-cli használat: baeldung-cli [] A parancsok: help Segítség információk megjelenítése setup-db Az adatbázis telepítési naplónk beállítása A naplónk beállítása Egy adott paranccsal kapcsolatos további információkért lásd a „baeldung-cli súgót”.

Ha inkább kivégezzük setup-napló - segítség, kapunk:

$ baeldung-cli beállítási napló - segítség NAME Név: baeldung-cli beállítási napló - A naplónk beállítása SYNOPSIS baeldung-cli telepítési napló [-h] [-v] OPCIÓK -h, --help A súgó információinak megjelenítése -v, - -verbose A napló részletességének be- és kikapcsolása

Végül a paraméterek megadása ezeknek a parancsoknak a helyes üzleti logikát fogja futtatni.

8. Következtetés

Ebben a cikkben egy egyszerű, mégis hatékony parancssori felületet építettünk fel, nagyon kevés kódolással.

Az Airline könyvtár a hatékony funkcióival egyszerűsíti a CLI-t, általános, tiszta és újrafelhasználható infrastruktúrát biztosít számunkra. Lehetővé teszi számunkra, a fejlesztőknek, hogy üzleti logikánkra koncentráljunk, ahelyett, hogy időt szánnánk a triviális tervezésének.

Mint mindig, a kód megtalálható a GitHubon.


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