CLI rugós héjjal

1. Áttekintés

Egyszerűen fogalmazva: a Spring Shell projekt interaktív héjat biztosít a parancsok feldolgozásához és egy teljes funkcionalitású CLI felépítéséhez a Spring programozási modell segítségével.

Ebben a cikkben megvizsgáljuk annak jellemzőit, kulcsosztályait és kommentárjait, és számos egyéni parancsot és testreszabást valósítunk meg.

2. Maven-függőség

Először hozzá kell adnunk a rugós héj függőség a mi pom.xml:

 org.springframework.shell rugós héj 1.2.0.FELHASZNÁLÁS 

A műtárgy legújabb verziója itt található.

3. Hozzáférés a Shellhez

Alkalmazásainkban két fő módja van a héj elérésének.

Az első az, hogy indítsuk a héjat az alkalmazásunk belépési pontjában, és hagyjuk, hogy a felhasználó beírja a parancsokat:

public static void main (String [] args) dobja az IOException {Bootstrap.main (args); }

A második az, hogy a JLineShellComponent és programszerűen hajtsa végre a parancsokat:

Bootstrap bootstrap = új Bootstrap (); JLineShellComponent shell = bootstrap.getJLineShellComponent (); shell.executeCommand ("help");

Az első megközelítést fogjuk használni, mivel az a legjobban megfelel a cikk példáinak, azonban a forráskódban olyan teszteseteket találhat, amelyek a második űrlapot használják.

4. Parancsok

A shellben már több beépített parancs található, mint pl egyértelmű, Segítség, kijáratstb., amelyek minden CLI szabványos funkcionalitását biztosítják.

Az egyéni parancsok a @CliCommand jelölés egy Spring komponensen belül, amely a CommandMarker felület.

A módszer minden argumentumát a-val kell jelölni @CliOption kommentár, ha ezt nem sikerül megtenni, akkor több hibát tapasztalunk a parancs végrehajtásakor.

4.1. Parancsok hozzáadása a Shellhez

Először tudnunk kell a shellről, hogy hol vannak a parancsaink. Ehhez a fájlra van szükség META-INF / spring / spring-shell-plugin.xml Ahhoz, hogy jelen lehessünk projektünkben, használhatjuk a Spring komponens-szkennelési funkcióit:

Amint az alkatrészeket a Spring regisztrálja és példányosítja, regisztrálja őket a shell elemzőnél, és feljegyzéseiket feldolgozza.

Hozzunk létre két egyszerű parancsot, az egyiket az URL tartalmának megragadásához és megjelenítéséhez, a másikat pedig a fájl tartalmának mentéséhez:

@Component public class SimpleCLI implementálja a CommandMarker {@CliCommand (value = {"web-get", "wg"}) public String webGet (@CliOption (key = "url") String url) {return getContentsOfUrlAsString (url); } @CliCommand (value = {"web-save", "ws"}) public String webSave (@CliOption (key = "url") String url, @CliOption (key = {"out", "file"}) karakterlánc fájl) {Karakterlánc tartalma = getContentsOfUrlAsString (url); próbáld ki (PrintWriter out = new PrintWriter (fájl)) {out.write (tartalom); } return "Kész". }}

Vegye figyelembe, hogy több karakterláncot is átadhatunk a érték és kulcs tulajdonságai @CliCommand és @CliOption illetve ez lehetővé teszi számunkra, hogy több olyan parancsot és érvet tegyünk közzé, amelyek ugyanúgy viselkednek.

Most ellenőrizzük, hogy minden a várt módon működik-e:

spring-shell> web-get --url //www.google.com web-save --url //www.google.com --out content.txt Kész.

4.2. A parancsok elérhetősége

Használhatjuk a @CliAvailabilityIndicator megjegyzés egy metódushoz, amely visszaadja a logikai futás közben megváltoztatni, ha egy parancsnak ki van téve a shell.

Először hozzunk létre egy módszert a web-mentés parancs:

privát logikai adminEnableExecuted = hamis; @CliAvailabilityIndicator (value = "web-save") public boolean isAdminEnabled () {return adminEnableExecuted; }

Most hozzunk létre egy parancsot a adminEnableExecuted változó:

@CliCommand (value = "admin-enable") public String adminEnable () {adminEnableExecuted = true; return "Admin parancsok engedélyezve."; }

Végül ellenőrizzük:

spring-shell> web-save --url //www.google.com --out content.txt Parancs "web-save --url //www.google.com --out content.txt" megtalálható, de nem jelenleg elérhető (írja be a 'help', majd az ENTER billentyűt a parancs megismeréséhez) spring-shell> admin-enable Admin parancsok engedélyezve. spring-shell> web-save --url //www.google.com --out content.txt Kész.

4.3. Szükséges érvek

Alapértelmezés szerint az összes parancs argumentum opcionális. Mindazonáltal szükségessé tehetjük őket a kötelező attribútuma @CliOption kommentár:

@CliOption (kulcs = {"ki", "fájl"}, kötelező = igaz)

Most tesztelhetjük, hogy ha nem vezetjük be, hibát eredményez:

spring-shell> web-save --url //www.google.com Ennek a parancsnak meg kell adnia az (--out) opciót

4.4. Alapértelmezett érvek

Egy üres kulcs értéke a @CliOption alapértelmezetté teszi ezt az érvet. Itt megkapjuk a héjba bevezetett értékeket, amelyek nem szerepelnek nevezett argumentumban:

@CliOption (kulcs = {"", "url"})

Most ellenőrizzük, hogy a várt módon működik-e:

spring-shell> web-get //www.google.com 

4.5. Segítség a felhasználóknak

@CliCommand és @CliOption az annotációk a Segítség attribútum, amely lehetővé teszi számunkra, hogy eligazítsuk a felhasználókat a beépített használat során Segítség parancsot, vagy amikor az automatikus kitöltéshez lapozzon.

Módosítsuk a web-get egyéni súgóüzenetek hozzáadásához:

@CliCommand (// ... help = "Megjeleníti egy URL tartalmát") public String webGet (@CliOption (// ... help = "URL, amelynek tartalma megjelenik.") String url) {//. ..}

Most a felhasználó pontosan tudja, mit csinál a parancsunk:

spring-shell> help web-get Kulcsszó: web-get Kulcsszó: wg Leírás: Megjeleníti az URL tartalmát. Kulcsszó: ** alapértelmezett ** Kulcsszó: url Help: URL, amelynek tartalma megjelenik. Kötelező: hamis Alapértelmezés, ha meg van adva: '__NULL__' Alapértelmezés, ha nincs megadva: '__NULL__' * web-get - Megjeleníti az URL tartalmát. * wg - Megjeleníti az URL tartalmát.

5. Testreszabás

A héj testreszabására háromféle módon van lehetőség a BannerProvider, PromptProvider és HistoryFileNameProvider interfészek, mindegyik alapértelmezett megvalósítással már biztosított.

Továbbá használnunk kell a @Rendelés megjegyzés, amely lehetővé teszi, hogy szolgáltatóink elsőbbséget élvezhessenek az ilyen megvalósításokkal szemben.

Hozzunk létre egy új szalaghirdetést a testreszabás megkezdéséhez:

@Component @Order (Rendelt.HIGHEST_PRECEDENCE) nyilvános osztály A SimpleBannerProvider kiterjeszti a DefaultBannerProvider {public String getBanner () {StringBuffer buf = new StringBuffer (); buf.append ("=======================================" "). append (OsUtils .LINE_SEPARATOR); buf.append ("* Baeldung Shell *") .append (OsUtils.LINE_SEPARATOR); buf.append ("=======================================" "). append (OsUtils .LINE_SEPARATOR); buf.append ("Verzió:") .append (this.getVersion ()); return buf.toString (); } public String getVersion () {return "1.0.1"; } public String getWelcomeMessage () {return "Üdvözöljük a Baeldung CLI-ben"; } public String getProviderName () {return "Baeldung Banner"; }}

Ne feledje, hogy a verziószámot és az üdvözlő üzenetet is megváltoztathatjuk.

Most változtassuk meg a felszólítást:

@Component @Order (Rendelt.HIGHEST_PRECEDENCE) nyilvános osztály A SimplePromptProvider kiterjeszti a DefaultPromptProvider {public String getPrompt () {return "baeldung-shell"; } public String getProviderName () {return "Baeldung Prompt"; }}

Végül módosítsuk az előzményfájl nevét:

@Component @Order (Rendelt.HIGHEST_PRECEDENCE) public class SimpleHistoryFileNameProvider kiterjeszti a DefaultHistoryFileNameProvider {public String getHistoryFileName () {return "baeldung-shell.log"; } public String getProviderName () {return "Baeldung History"; }}

Az előzményfájl rögzíti a parancsértelmezőben végrehajtott összes parancsot, és az alkalmazásunk mellé kerül.

Ha minden a helyén van, hívhatjuk a héját, és láthatjuk működés közben:

======================================= * Baeldung Shell * ======= ================================ Verzió: 1.0.1 Üdvözöljük a Baeldung CLI baeldung-shell oldalán!

6. Átalakítók

Eddig csak egyszerű típusokat használtunk argumentumként a parancsokhoz. Gyakori típusok, mint pl Egész szám, Dátum, Enum, Filestb., már regisztráltak egy alapértelmezett konvertert.

A Átalakító felületen hozzáadhatjuk átalakítóinkat is egyéni objektumok fogadásához.

Hozzunk létre egy átalakítót, amely képes átalakítani a Húr egy an URL:

@Component public class SimpleURLConverter implementálja a Converter {public URL convertFromText (String érték, Class requiredType, String optionContext) {return new URL (value); } public boolean getAllPossibleValues ​​(Lista kitöltése, Class requiredType, String existingData, String optionContext, MethodTarget target) {return false; } nyilvános logikai támogatások (Class requiredType, String optionContext) {return URL.class.isAssignableFrom (requiredType); }}

Végül módosítsuk web-get és web-mentés parancsok:

public String webSave (... URL URL) {// ...} public String webSave (... URL URL) {// ...}

Mint sejtette, a parancsok ugyanúgy viselkednek.

7. Következtetés

Ebben a cikkben röviden áttekintettük a Spring Shell projekt alapvető jellemzőit. Hozzájárulhattunk a parancsainkhoz és testreszabhattuk a shell-t a szolgáltatóinkkal, megváltoztattuk a parancsok elérhetőségét a különböző futási feltételek szerint, és létrehoztunk egy egyszerű típusú átalakítót.

A cikk teljes forráskódja megtalálható a GitHub oldalon.