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:

  1. La définition des options
  2. Le parsing de la ligne de commande
  3. 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();
    }
}

Rédigé par Bliz

Publié dans #Java

Repost 0
Commenter cet article

Bliz 13/04/2010 09:56



Et oui, comme vous avez pu le remarquer, il y a une cerise sur le gateau car commons-CLI permet d'afficher l'aide sur l'utilisation du programme en fonction des options définies:


HelpFormatter formatter = new HelpFormatter();


formatter.printHelp("App", options);


"App" correspond ici au nom du programme. Ici avec les options définies ici on affichera:


usage: App
 -h,--help               prints the help content
 -c,--config     configuration file
  -i,--input      input file
 -o,--output    output file