Spring Shell

The Spring Shell project provides an interactive shell that allows you to plugin your own custom commands using a Spring based programming model.

Quick Start
Fork me on GitHub


Users of the Spring Shell project can easily build a full featured shell ( aka command line) application by depending on the Spring Shell jars and adding their own commands (which come as methods on spring beans). Creating a command line application can be useful e.g. to interact with your project's REST API, or to work with local file content.


Spring Shell's features include

  • A simple, annotation driven, programming model to contribute custom commands
  • Use of Spring Boot auto-configuration functionality as the basis for a command plugin strategy
  • Tab completion, colorization, and script execution
  • Customization of command prompt, shell history file name, handling of results and errors
  • Dynamic enablement of commands based on domain specific criteria
  • Integration with the bean validation API
  • Already built-in commands, such as clear screen, gorgeous help, exit
  • ASCII art Tables, with formatting, alignment, fancy borders, etc.

Quick Start


The recommended way to get started using spring-shell in your project is with a dependency management system – the snippet below can be copied and pasted into your build. Need help? See our getting started guides on building with Maven and Gradle.

Then to create a simple command that could be invoked as

shell:>translate "hello world!" --from en_US --to fr_FR
bonjour monde!

assuming you'd have access to some kind of translation service that worked with Locales:

package foo;

public class TranslationCommands {

    private final TranslationService service;

    public TranslationCommands(TranslationService service) {
      this.service = service;

    @ShellMethod("Translate text from one language to another.")
    public String translate(
      @ShellOption(mandatory = true) String text,
      @ShellOption(mandatory = true, defaultValue = "en_US") Locale from,
      @ShellOption(mandatory = true) Locate to
    ) {
      // invoke service
      return service.translate(text, from, to);