CLI s Spring Shell

1. Prehľad

Zjednodušene povedané, projekt Spring Shell poskytuje interaktívne prostredie na spracovanie príkazov a vytváranie plnohodnotného CLI pomocou programovacieho modelu Spring.

V tomto článku preskúmame jeho funkcie, kľúčové triedy a anotácie a implementujeme niekoľko vlastných príkazov a prispôsobení.

2. Závislosť od Maven

Najprv musíme pridať pružinová škrupina závislosť na našom pom.xml:

 org.springframework.shell spring-shell 1.2.0.RELEASE 

Najnovšiu verziu tohto artefaktu nájdete tu.

3. Prístup k Shell

V našich aplikáciách existujú dva hlavné spôsoby prístupu k shellu.

Prvým je zaviesť shell do vstupného bodu našej aplikácie a nechať používateľa zadať príkazy:

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

Druhým je získanie a JLineShellComponent a vykonajte príkazy programovo:

Bootstrap bootstrap = nový Bootstrap (); JLineShellComponent shell = bootstrap.getJLineShellComponent (); shell.executeCommand ("pomoc");

Použijeme prvý prístup, pretože ten sa najlepšie hodí pre príklady v tomto článku, v zdrojovom kóde však nájdete testovacie prípady, ktoré používajú druhý formulár.

4. Príkazy

V shelli je už niekoľko zabudovaných príkazov, ako napr jasný, Pomoc, východatď., ktoré poskytujú štandardnú funkčnosť každého CLI.

Vlastné príkazy je možné odhaliť pridaním metód označených symbolom @CliCommand anotácia vo vnútri komponentu Spring implementujúca CommandMarker rozhranie.

Každý argument tejto metódy musí byť označený a @CliOption anotácia, ak to neurobíme, pri pokuse o vykonanie príkazu sa stretneme s niekoľkými chybami.

4.1. Pridávanie príkazov do shellu

Najskôr musíme shellu oznámiť, kde sú naše príkazy. Vyžaduje si to súbor META-INF / jar / spring-shell-plugin.xml aby sme boli prítomní v našom projekte, môžeme tam použiť funkciu skenovania komponentov Spring:

Po zaregistrovaní a vytvorení inštancie komponentom Spring sú komponenty zaregistrované v syntaktickom analyzátore shellu a ich anotácie sú spracované.

Vytvorme dva jednoduché príkazy, jeden na zachytenie obsahu adresy URL a jeho zobrazenie a druhý na uloženie tohto obsahu do súboru:

@Component public class SimpleCLI implementuje 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 súbor) {String contents = getContentsOfUrlAsString (url); try (PrintWriter out = new PrintWriter (file)) {out.write (contents); } návrat „Hotovo.“; }}

Upozorňujeme, že do súboru môžeme vložiť viac ako jeden reťazec hodnotu a kľúč atribúty @CliCommand a @CliOption To nám umožňuje vystaviť niekoľko príkazov a argumentov, ktoré sa správajú rovnako.

Teraz skontrolujme, či všetko funguje podľa očakávaní:

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

4.2. Dostupnosť príkazov

Môžeme použiť @CliAvailabilityIndicator anotácia k metóde vracania a boolovský za behu zmeniť, ak má byť príkaz vystavený shellu.

Najskôr vytvorme metódu na úpravu dostupnosti súboru web-save príkaz:

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

Teraz vytvorme príkaz na zmenu adminEnableExecuted premenná:

@CliCommand (value = "admin-enable") public String adminEnable () {adminEnableExecuted = true; return "Príkazy správcu povolené."; }

Nakoniec to overíme:

spring-shell> web-save --url //www.google.com --out contents.txt Príkaz 'web-save --url //www.google.com --out contents.txt' bol nájdený, ale nie je momentálne dostupné (zadajte „help“ a potom sa o tomto príkaze dozviete pomocou ENTER) spring-shell> admin-enable Admin commands enabled. spring-shell> web-save --url //www.google.com --out contents.txt Hotovo.

4.3. Požadované argumenty

V predvolenom nastavení sú všetky argumenty príkazov voliteľné. Môžeme ich však požadovať pomocou povinné atribút @CliOption anotácia:

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

Teraz môžeme vyskúšať, že ak ho nezavedieme, bude mať za následok chybu:

spring-shell> web-save --url //www.google.com Pre tento príkaz by ste mali určiť možnosť (--out)

4.4. Predvolené argumenty

Prázdny kľúč hodnota pre a @CliOption robí tento argument predvoleným. Tam dostaneme hodnoty zavedené do shellu, ktoré nie sú súčasťou žiadneho pomenovaného argumentu:

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

Teraz skontrolujme, či funguje podľa očakávania:

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

4.5. Pomáhame používateľom

@CliCommand a @CliOption anotácie poskytujú a Pomoc atribút, ktorý nám umožňuje usmerniť našich používateľov pri používaní zabudovaného Pomoc príkaz alebo pri vytváraní tabulátora získate automatické dokončovanie.

Upravme naše web-get pridanie vlastných správ pomocníka:

@CliCommand (// ... help = "Zobrazí obsah adresy URL") public String webGet (@CliOption (// ... help = "URL, ktorého obsah sa zobrazí.") Adresa reťazca) {//. ..}

Teraz môže používateľ presne vedieť, čo náš príkaz robí:

spring-shell> help web-get Kľúčové slovo: web-get Kľúčové slovo: wg Popis: Zobrazí obsah adresy URL. Kľúčové slovo: ** predvolené ** Kľúčové slovo: url Pomoc: URL, ktorého obsah sa zobrazí. Povinné: false Predvolené, ak je zadané: '__NULL__' Predvolené, ak nie je uvedené: '__NULL__' * web-get - Zobrazí obsah adresy URL. * wg - zobrazuje obsah adresy URL.

5. Prispôsobenie

Existujú tri spôsoby, ako prispôsobiť shell implementáciou BannerProvider, PromptProvider a HistoryFileNameProvider rozhrania, všetky s už poskytnutými predvolenými implementáciami.

Musíme tiež použiť @Objednať anotácia, ktorá umožní našim poskytovateľom mať pred týmito implementáciami prednosť.

Vytvorme nový banner a začneme s prispôsobením:

@Component @Order (Ordered.HIGHEST_PRECEDENCE) verejná trieda SimpleBannerProvider rozširuje DefaultBannerProvider {public String getBanner () {StringBuffer buf = nový StringBuffer (); buf.append ("=======================================") .append (OsUtils .LINE_SEPARATOR); buf.append ("* Baeldung Shell *") .append (OsUtils.LINE_SEPARATOR); buf.append ("=======================================") .append (OsUtils .LINE_SEPARATOR); buf.append ("Verzia:") .append (this.getVersion ()); návrat buf.toString (); } public String getVersion () {návrat "1.0.1"; } public String getWelcomeMessage () {návrat "Vitajte na Baeldung CLI"; } public String getProviderName () {return "Baeldung Banner"; }}

Upozorňujeme, že tiež môžeme zmeniť číslo verzie a uvítaciu správu.

Teraz zmeňme výzvu:

@Component @Order (Ordered.HIGHEST_PRECEDENCE) verejná trieda SimplePromptProvider rozširuje DefaultPromptProvider {public String getPrompt () {return "baeldung-shell"; } public String getProviderName () {return "Baeldung Prompt"; }}

Na záver upravíme názov súboru histórie:

@Component @Order (Ordered.HIGHEST_PRECEDENCE) verejná trieda SimpleHistoryFileNameProvider rozširuje DefaultHistoryFileNameProvider {public String getHistoryFileName () {return "baeldung-shell.log"; } public String getProviderName () {return "Baeldung History"; }}

Súbor histórie bude zaznamenávať všetky príkazy vykonané v shelli a bude vložený spolu s našou aplikáciou.

Keď je všetko na svojom mieste, môžeme zavolať náš shell a vidieť ho v akcii:

======================================= * Baeldung Shell * ======== ================================ Verzia: 1.0.1 Vitajte v Baeldung CLI baeldung-shell>

6. Prevodníky

Doteraz sme ako argumenty k našim príkazom používali iba jednoduché typy. Bežné typy ako napr Celé číslo, Dátum, Enum, Súbor, atď., majú už registrovaný predvolený prevodník.

Implementáciou Prevádzač môžeme tiež pridať naše prevádzače na príjem vlastných objektov.

Vytvorme prevodník, ktorý dokáže transformovať a String do URL:

@ Verejná trieda komponentu SimpleURLConverter implementuje Converter {public URL convertFromText (String value, Class requiredType, String optionContext) {return new URL (value); } public boolean getAllPossibleValues ​​(dokončenie zoznamu, požadovaná trieda, reťazec existujúce údaje, reťazec optionContext, cieľ MethodTarget) {return false; } public boolean podporuje (Class requiredType, String optionContext) {návrat URL.class.isAssignableFrom (requiredType); }}

Nakoniec si upravme našu získaj web a web-save príkazy:

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

Ako ste už asi uhádli, príkazy sa správajú rovnako.

7. Záver

V tomto článku sme sa krátko pozreli na základné vlastnosti projektu Spring Shell. Boli sme schopní prispieť našimi príkazmi a prispôsobiť shell našim poskytovateľom, zmenili sme dostupnosť príkazov podľa rôznych runtime podmienok a vytvorili jednoduchý prevodník typov.

Kompletný zdrojový kód tohto článku nájdete na GitHub.


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