Module io.github.mmm.cli


module io.github.mmm.cli
Provides the API and implementation to parse the arguments of a main method from a command-line-interface (CLI).

Command-Line-Interfaces (CLI)

Building a Java application with a CLI is kind of tedious.

The Problem

A regular Java application start with a main method:
 public static void main(String[] args) {

   // ...
 }
 
However, you quickly notice that this was not the end of wisdom when designing an object-oriented language as Java. A main-program often starts easy and then over the time options and arguments are added. When you want to write a maintainable main-program you want to have more infrastructure than just having a String-array lost in a static method.

The Solution

As a minimal low-level solution we provide CliArgs:
 public class Main {

   private boolean verbose;

   private boolean debug;

   private boolean force;

   List<String> values = new ArrayList<>();

   public static void main(String[] args) {

     int exitCode = run(new CliArgs(args));
     System.exit(exitCode);
   }

   public int run(CliArgs args) {

     CliArgument arg = args.getFirst();
     while (arg != null) {
       if (arg.isOption()) {
         switch (arg.get()) {
           case "-h":
           case "--help":
             printHelp();
             return 0;
             break;
           case "-v":
           case "--verbose":
             this.verbose = true;
             break;
           case "-d":
           case "--debug":
             this.debug = true;
             break;
           case "-f":
           case "--force":
             this.force = true;
             break;
           default:
             System.err.println("Illegal option: " + arg);
             return -1;
         }
       } else {
         this.values.add(arg.get());
       }
       arg = arg.getNext();
     }
     // do something
   }
 }
 
Now you can run this Main program with:
 Main -v -d -f file1 file2
 
You can quickly guess what will happen, but you can also do the same thing with:
 Main -vdf file1 file2
 
And if you want to provide a filename starting with a hyphen you can do
 Main -vdf -- -filename
 
Further, a CLI may have options that need a value:
 App --option-name option-value
 
Your App does not need to be rewritten to also accept:
 App --option-name=option-value
 
Of course the Main program was still complex and this is just the beginning. We provide a higher-level module mmm-nls-cli to make it even much simpler and add additional cool features.