CLI s Spring Shell

1. Pregled

Jednostavno rečeno, projekt Spring Shell pruža interaktivnu ljusku za obradu naredbi i izgradnju cjelovitog CLI-ja pomoću programskog modela Spring.

U ovom ćemo članku istražiti njegove značajke, klase ključeva i napomene i implementirati nekoliko prilagođenih naredbi i prilagodbi.

2. Ovisnost Mavena

Prvo, moramo dodati opružna školjka ovisnost o našoj pom.xml:

 org.springframework.shell opruga-ljuska 1.2.0.OSLOBODI 

Najnoviju verziju ovog artefakta možete pronaći ovdje.

3. Pristup ljusci

Postoje dva glavna načina za pristup ljusci u našim aplikacijama.

Prvo je pokretanje ljuske u ulaznoj točki naše aplikacije i dopuštanje korisniku da unese naredbe:

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

Druga je dobivanje a JLineShellComponent i naredbe izvršavajte programski:

Bootstrap bootstrap = novi Bootstrap (); JLineShellComponent ljuska = bootstrap.getJLineShellComponent (); shell.executeCommand ("pomoć");

Upotrijebit ćemo prvi pristup jer je najprikladniji za primjere u ovom članku, međutim u izvornom kodu možete pronaći test slučajeve koji koriste drugi obrazac.

4. Naredbe

U ljusci već postoji nekoliko ugrađenih naredbi, poput čisto, Pomozite, Izlazitd., koji pružaju standardnu ​​funkcionalnost svakog CLI-a.

Prilagođene naredbe mogu se izložiti dodavanjem metoda označenih znakom @CliCommand napomena unutar komponente Spring koja implementira CommandMarker sučelje.

Svaki argument te metode mora biti označen s @CliOption napomena, ako to ne uspijemo, naići ćemo na nekoliko pogrešaka prilikom pokušaja izvršavanja naredbe.

4.1. Dodavanje naredbi u ljusku

Prvo, moramo obavijestiti ljusku gdje su naše naredbe. Za to je potrebna datoteka META-INF / spring / spring-shell-plugin.xml da bismo bili prisutni u našem projektu, tamo možemo koristiti funkcionalnost skeniranja komponenata Springa:

Jednom kada komponente registriraju i pokrenu instancu Spring, registriraju se s analizatorom ljuske i obrađuju se njihove bilješke.

Stvorimo dvije jednostavne naredbe, jednu za hvatanje sadržaja URL-a i njihovo prikazivanje, a drugu za spremanje tog sadržaja u datoteku:

@Component javna klasa SimpleCLI implementira 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"}) String datoteka) {Sadržaj niza = getContentsOfUrlAsString (url); probajte (PrintWriter out = novi PrintWriter (datoteka)) {out.write (sadržaj); } return "Gotovo."; }}

Imajte na umu da možemo proslijediti više od jednog niza u vrijednost i ključ atributi @CliCommand i @CliOption to nam dopušta izlaganje nekoliko naredbi i argumenata koji se ponašaju isto.

Sada provjerimo radi li sve prema očekivanjima:

spring-shell> web-get --url //www.google.com web-save --url //www.google.com --out contents.txt Gotovo.

4.2. Dostupnost naredbi

Možemo koristiti @CliAvailabilityIndicator napomena o metodi koja vraća a boolean za promjenu, tijekom izvođenja, ako naredba treba biti izložena ljusci.

Prvo, kreirajmo metodu za izmjenu dostupnosti web-spremanje naredba:

private boolean adminEnableExecuted = false; @CliAvailabilityIndicator (value = "web-save") public boolean isAdminEnabled () {return adminEnableExecuted; }

Sada, kreirajmo naredbu za promjenu adminEnableExecuted varijabla:

@CliCommand (value = "admin-enable") javni niz adminEnable () {adminEnableExecuted = true; return "Administratorske naredbe omogućene."; }

Na kraju, provjerimo:

spring-shell> web-save --url //www.google.com --out contents.txt Naredba 'web-save --url //www.google.com --out contents.txt' pronađena je, ali nije trenutno dostupno (upišite "pomoć", a zatim ENTER da biste saznali više o ovoj naredbi) spring-shell> admin-enable Admin naredbe omogućene. spring-shell> web-save --url //www.google.com --out contents.txt Gotovo.

4.3. Potrebni argumenti

Prema zadanim postavkama, svi su argumenti naredbe neobavezni. Međutim, možemo ih učiniti potrebnima pomoću obvezno atribut @CliOption napomena:

@CliOption (key = {"out", "file"}, obavezno = true)

Sada možemo testirati da ako ga ne uvedemo, rezultira pogreškom:

spring-shell> web-save --url //www.google.com Za ovu naredbu trebali biste navesti opciju (--out)

4.4. Zadani argumenti

Prazan ključ vrijednost za a @CliOption čini taj argument zadanim. Tamo ćemo primiti vrijednosti uvedene u ljusku koje nisu dio niti jednog imenovanog argumenta:

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

Provjerimo sada da li radi prema očekivanjima:

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

4.5. Pomoć korisnicima

@CliCommand i @CliOption bilješke daju a Pomozite atribut koji nam omogućuje usmjeravanje naših korisnika prilikom korištenja ugrađenog Pomozite naredba ili prilikom tabuliranja za automatsko dovršavanje.

Izmijenimo svoj web-dobiti za dodavanje prilagođenih poruka pomoći:

@CliCommand (// ... help = "Prikazuje sadržaj URL-a") javni String webGet (@CliOption (// ... help = "URL čiji će sadržaj biti prikazan.") URL niza) {//. ..}

Sada korisnik može točno znati što naša naredba radi:

spring-shell> pomoć web-get Ključna riječ: web-get Ključna riječ: wg Opis: Prikazuje sadržaj URL-a. Ključna riječ: ** zadana ** Ključna riječ: url Pomoć: URL čiji će sadržaj biti prikazan. Obavezno: false Zadano ako je navedeno: '__NULL__' Zadano ako nije određeno: '__NULL__' * web-get - prikazuje sadržaj URL-a. * wg - prikazuje sadržaj URL-a.

5. Prilagođavanje

Postoje tri načina za prilagodbu ljuske primjenom BannerProvider, PromptProvider i HistoryFileNameProvider sučelja, svi oni sa zadanim implementacijama već osigurani.

Također, trebamo koristiti @Narudžba napomena kako bi omogućili našim pružateljima usluga da imaju prednost nad tim implementacijama.

Stvorimo novi natpis za početak prilagodbe:

@Component @Order (Ordered.HIGHEST_PRECEDENCE) javna klasa SimpleBannerProvider proširuje DefaultBannerProvider {javni niz getBanner () {StringBuffer buf = novi StringBuffer (); buf.append ("==========================================="). append (OsUtils .LINE_SEPARATOR); buf.append ("* Baeldung Shell *") .append (OsUtils.LINE_SEPARATOR); buf.append ("==========================================="). append (OsUtils .LINE_SEPARATOR); buf.append ("Verzija:") .append (this.getVersion ()); vratiti buf.toString (); } javni String getVersion () {return "1.0.1"; } public String getWelcomeMessage () {return "Dobrodošli u Baeldung CLI"; } javni String getProviderName () {return "Baeldung Banner"; }}

Imajte na umu da također možemo promijeniti broj verzije i poruku dobrodošlice.

Sada, promijenimo upit:

@Component @Order (Ordered.HIGHEST_PRECEDENCE) javna klasa SimplePromptProvider proširuje DefaultPromptProvider {javni niz getPrompt () {return "baeldung-shell"; } javni String getProviderName () {return "Baeldung Prompt"; }}

Na kraju, izmijenimo naziv datoteke povijesti:

@Component @Order (Ordered.HIGHEST_PRECEDENCE) javna klasa SimpleHistoryFileNameProvider proširuje DefaultHistoryFileNameProvider {public String getHistoryFileName () {return "baeldung-shell.log"; } javni String getProviderName () {return "Povijest Baeldunga"; }}

Datoteka povijesti zabilježit će sve naredbe izvršene u ljusci i stavit će se uz našu aplikaciju.

Sa svime na svom mjestu, možemo nazvati svoju ljusku i vidjeti je na djelu:

========================================= * Baeldung školjka * ======= ================================ Verzija: 1.0.1 Dobrodošli u Baeldung CLI baeldung-shell>

6. Pretvarači

Do sada smo koristili samo jednostavne tipove kao argumente svojih naredbi. Uobičajene vrste kao što su Cijeli broj, Datum, Enum, Datotekaitd., imaju zadani pretvarač već registriran.

Primjenom Konverter sučelje, možemo dodati i svoje pretvarače za primanje prilagođenih objekata.

Stvorimo pretvarač koji može transformirati a Niz u an URL:

@Component javna klasa SimpleURLConverter implementira Converter {javni URL convertFromText (vrijednost niza, klasa requiredType, niz opcijeContext) {return new URL (value); } javna logička vrijednost getAllPossibleValues ​​(Popunjavanje popisa, Klasa requiredType, Niz postojećih podataka, Niz stringContext, Cilj cilja meta) {return false; } javne logičke podrške (klasa requiredType, niz opcijaContext) {return URL.class.isAssignableFrom (requiredType); }}

Napokon, izmijenimo naš web-dobiti i web-spremanje naredbe:

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

Kao što ste mogli pretpostaviti, naredbe se ponašaju isto.

7. Zaključak

U ovom smo članku kratko pregledali osnovne značajke projekta Spring Shell. Uspjeli smo doprinijeti svojim naredbama i prilagoditi ljusku s našim dobavljačima, promijenili smo dostupnost naredbi u skladu s različitim uvjetima izvođenja i stvorili jednostavan pretvarač tipova.

Kompletni izvorni kod za ovaj članak možete pronaći na GitHubu.


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