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.