Spring ed in genere i progetti Spring Boot vengono largamente usati per costruire applicativi di backend che espongono API Rest e si collegano a fonti dati tramite Spring Data. Ma possiamo spingerci oltre e creare molteplici tipologie di applicazioni. Scopriamo in che modo grazie a Spring Shell.

Spring Shell e applicativi CLI: quando sono utili?

Spring Shell è un sotto progetto di Spring che ci permette di costruire delle command line application, anche note come CLI command-line interface. Ma quando abbiamo bisogno di un applicativo command line?

Un applicativo CLI è utile quando si interagisce con l’utente attraverso la shell: all’utente viene richiesto di rispondere a determinate domande e le risposte date offrono i parametri necessari per una determinata elaborazione. Un altro utilizzo è l’esecuzione con parametri definiti all’avvio (o anche senza): viene creato un processo che esegue l’elaborazione di una determinata funzione al termine della quale il processo viene terminato.

Gli applicativi CLI non hanno alcuna interfaccia grafica o visiva oltre a quella che vediamo nel terminale dopo aver eseguito il programma. Allocano risorse (CPU e RAM) solo durante il loro funzionamento, al termine del quale il processo si chiude liberando RAM e rilasciando l’impegno della CPU.

Come attivare Spring Shell nel progetto

Per poter attivare questo componente all’interno della nostra applicazione Spring Boot sarà sufficiente modificare Maven o Gradel come sotto riportato. Spring Boot auto-configuration all’avvio dell’applicazione troverà la dipendenza ed attiverà in automatico il modulo rendendolo pronto all’uso.

Per Maven aggiungere al pom.xml la dipendenza

<dependency>
  <groupId>org.springframework.shell</groupId>
  <artifactId>spring-shell-starter</artifactId>
  <version>2.1.3</version>
</dependency>

Per Gradel aggiungere al build.gradle la dipendenza

implementation group: 'org.springframework.shell', name: 'spring-shell-starter', version: '2.1.3'

Spring Shell può essere configurato all’interno delle nostre classi semplicemente utilizzando le annotazioni Java. Questo permette di semplificare gli aspetti di configurazione e inseguire il concetto di “Convention Over Configuration“.

programmatore davanti al monitor

Differenza tra shell e script

Spring Shell ha principalmente due funzionalità di funzionamento: shell e script.

Nella modalità shell abbiamo un terminale col quale possiamo interagire richiamando funzionalità scritte nel nostro applicativo. Ad ogni nostro comando visualizzeremo il relativo risultato ed avremo la possibilità di vedere la cronologia dei comandi eseguiti. Se non si vuole mantenere la cronologia è sufficiente aggiungere il seguente codice all’interno di una classe decorata con @Configuration o nella principale @SpringBootApplication.

@Component
public class NoSaveHistory extends DefaultHistory {
    @Override
    public void save() {}
}

Nella modalità script invece possiamo richiamare un file contenente uno o più comandi da eseguire senza interazione con l’utente. L’applicativo verrà avviato, con il parametro @, eseguirà tutti i comandi cotenuti nello script e terminerà.

Per creare la nostra prima funzione dovremo creare una nuova classe decorata con l’annotazione @ShellComponent ed il metodo contenente il corpo della funzione con @ShellMethod. Gli eventuali parametri andranno decorati con @ShellOption.

@ShellComponent
public class Test {

    @ShellMethod(value = "Saluta una persona")
    public void saluta(@ShellOption String nome, @ShellOption String cognome) {
        System.out.println(
                String.format(
                        "Ciao %s %s",
                        nome,
                        cognome
                )
        );
    }

}

output applicazione spring shell

Questo è un semplice esempio per mostrare quanto possa essere semplice attraverso Spring Shell creare applicazioni CLI. Per maggiori dettagli si consiglia di leggere Spring Shell Reference Documentation, mentre per qualsiasi necessità e supporto nello sviluppo siamo a tua disposizione!