Gérer les options passées à un programme java avec commons-CLI
Publié le 13 Avril 2010
Une implémentation java de getopts est fournie par la fondation apache sous l'appelation commons-cli. CLI signifie ici Command Line Interface.
Vous pouvez retrouver toutes les informations ici: http://commons.apache.org/cli/
L'utilisation de commons-CLI s'effectue en 3 étapes:
- La définition des options
- Le parsing de la ligne de commande
- L'interrogation pour récupérer les résultat du parsing
Il existe plusieurs façons de définir les options à l'étape 1:
- En utilisant le constructeur Option:
Option help = new Option( "help", "print this message" );
- En utilisant la méthode addOption d'un objet Options:
options.addOption("d", false, "activate debug mode");
- En utilisant la classe OptionBuilder:
OptionBuilder.withArgName( "file" ) .hasArg() .withDescription( "input file" ) .create( "input" );
Il existe plusieurs type de parser pour effectuer l'étape2:
- PosixParser: Pour une ligne de commande contenant des options courtes du type "tar -xvzf file.tar.gz"
- GnuParser: Permet de traiter une ligne de commande avec des option de plusieurs caractères.
Voilà pour la théorie, passons à un exemple plus pratique:
package com.over-blog.patatos.cli;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.MissingArgumentException;
import org.apache.commons.cli.MissingOptionException;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
public class App{
public static void main( String[] args ){
//Etape 1: Définition des options
Options options = new Options();
options.addOption("h", "help", false, "prints the help content");
options.addOption(OptionBuilder
.withArgName("file")
.hasArg()
.isRequired()
.withDescription("input file")
.withLongOpt("input")
.create("i"));
options.addOption(OptionBuilder
.withArgName("file")
.hasArg()
.withDescription("output file")
.withLongOpt("output")
.create("o"));
options.addOption(OptionBuilder
.withArgName("file")
.hasArg()
.withDescription("configuration file")
.withLongOpt("config")
.create("c"));
try{
//Etape 2: Analyse de la ligne de commande
CommandLineParser parser = new GnuParser();
cmd = parser.parse(options, args);
//Etape 3: Récupération et traitement des résultat
InputStream in = new FileInputStream(cmd.getOptionValue("i"));
//Par défaut écrit la sortie sur la sortie standard
OutputSteam out = System.out;
if(cmd.hasOption("o"))
out = new FileOutputStream(cmd.getOptionValue("o"));
String config = cmd.getOptionValue("c", "app.cfg"); // app.cfg est la valeur par défaut
//effectue le traitement en fonction des options
// runApp(in, out, config); ...
}
catch(MissingOptionException e){
//vérifie si l'option -h est présente
boolean help = false;
try{
Options helpOptions = new Options();
helpOptions.addOption("h", "help", false, "prints the help content");
CommandLineParser parser = new PosixParser();
CommandLine line = parser.parse(helpOptions, args);
if(line.hasOption("h")) help = true;
}
catch(Exception ex){ }
if(!help) System.err.println(e.getMessage());
//Et oui commons-cli permet aussi d'affiche l'aide
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( "App" , options );
System.exit(1);
} catch(MissingArgumentException e){
System.err.println(e.getMessage());
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( "App" , options );
System.exit(1);
} catch(ParseException e){
System.err.println("Error while parsing the command line: "+e.getMessage());
System.exit(1);
} catch(Exception e){
e.printStackTrace();
}
}