Skip to main content

jline-shell

The jline-shell module provides a clean API for building interactive command-line applications with JLine. It defines the core abstractions for commands, command groups, command dispatching, pipelines, and job management.

Architecture​

The shell module sits between jline-reader and jline-console in the module dependency graph:

jline-terminal
↑
jline-reader
↑
jline-shell ← this module
↑
jline-console (legacy bridge)

Core Concepts​

Command​

A Command encapsulates everything about a command: its name, aliases, description, execution logic, and completion support.

Command echo = new AbstractCommand("echo", "e") {
@Override
public String description() {
return "Echo arguments to output";
}

@Override
public Object execute(CommandSession session, String[] args) {
session.out().println(String.join(" ", args));
return null;
}
};

CommandGroup​

A CommandGroup organizes commands for discovery. Unlike the old CommandRegistry, it has no execution or completion concerns — those belong to the CommandDispatcher.

CommandGroup group = new SimpleCommandGroup("myapp", echoCmd, greetCmd);

CommandDispatcher​

The CommandDispatcher aggregates command groups and handles command resolution, pipeline execution, and completion.

CommandDispatcher dispatcher = new DefaultCommandDispatcher(terminal);
dispatcher.addGroup(group);
Object result = dispatcher.execute("echo hello | grep h");

Shell​

The Shell is a thin REPL loop. Use the builder API to configure it:

Shell shell = Shell.builder()
.terminal(terminal)
.prompt("myapp> ")
.groups(group1, group2)
.historyFile(Paths.get("~/.myapp_history"))
.build();
shell.run();

Pipeline Support​

The shell module includes pipeline parsing and execution with operators like | (pipe), |; (flip), && (and), || (or), ; (sequence), > (redirect), >> (append), and & (background).

The PipelineParser is extensible — register custom operators via its constructor, or subclass and override matchOperator() for full control.

Alias System​

The AliasManager interface and DefaultAliasManager implementation provide a command alias system with $1/$2/$@ parameter substitution and optional file persistence. When configured, alias and unalias commands are automatically registered.

Built-in Commands​

The shell provides opt-in command groups via the builder:

  • historyCommands(true) — history command with list/search/clear/save
  • helpCommands(true) — help command listing all commands by group
  • optionCommands(true) — setopt/unsetopt/setvar for runtime LineReader configuration

Syntax Highlighting​

The CommandHighlighter highlights known commands in bold, unknown commands in red, and pipeline operators in cyan. Enable with commandHighlighter(true) on the builder, or provide a custom Highlighter.

Job Management​

The JobManager and Job interfaces provide job control for managing foreground, background, and suspended commands.

Maven Dependency​

<dependency>
<groupId>org.jline</groupId>
<artifactId>jline-shell</artifactId>
<version>${jline.version}</version>
</dependency>

Migration from Console API​

If you're using the old CommandRegistry/SystemRegistry API from jline-console, see the Migration Guide for how to use bridge adapters.