Making a CLI
Installing Picocli
We're going to be using Picocli to make our command line
To add this as a dependency in Maven, add the following dependency to the dependencies in your pom.xml
<dependency>
<groupId>info.picocli</groupId>
<artifactId>picocli</artifactId>
<version>4.7.6</version>
</dependency>
Setting up your CLI
In the main class, we set up picocli.CommandLine
to process the command line args
.
package com.corndel.healthtracker;
import picocli.CommandLine;
import picocli.CommandLine.Command;
@Command(name = "healthtracker", description = "A CLI health tracker")
public class App {
public static void main(String[] args) {
CommandLine cli = new CommandLine(new App());
int exitCode = cli.execute(args);
System.exit(exitCode);
}
}
INFO
Picocli uses annotations to declare metadata.
Here, we use the @Command()
annotation to declare the name and description of our healthtracker
cli command.
Printing a message
To execute some code, we need to add a run()
method, and also implement the Runnable
interface.
@Command(name = "healthtracker", description = "A CLI health tracker")
public class App implements Runnable {
@Override
public void run() {
System.out.println("Welcome! Please specify a command.")
}
public static void main(String[] args) {
CommandLine cli = new CommandLine(new App());
int exitCode = cli.execute(args);
System.exit(exitCode);
}
}
Now the run()
method will run if the user simply executes healthtracker
in the terminal.
> healthtracker
Welcome! Please specify a command.
Handling input arguments
The user can specify arguments to pass to the run()
method. We configure the CLI to accept these using the @Parameters
decorator. We can access them around our class.
@Command(name = "healthtracker", description = "A CLI health tracker")
public class App implements Runnable {
@Parameters(index = "0", description = "The name to greet", defaultValue = "User")
private String name;
@Override
public void run() {
String msg = String.format("Welcome, %s! Please specify a command.", name);
System.out.println(msg);
}
public static void main(String[] args) {
CommandLine cli = new CommandLine(new App());
int exitCode = cli.execute(args);
System.exit(exitCode);
}
}
Now the user can pass their name to the CLI to get a more personalised message.
> healthtracker Magnus
Welcome, Magnus! Please specify a command.
TIP
Note that we have include the defaultValue
in the @Parameter
field. If no name is given, this default value will be used instead.