Args4j ou de l'utilisation de Java pour faire des Batchs
Parce que ça fait longtemps que je n'ai pas parlé d'informatique, je vais présenter cette petite librairie qui permet de faire les choses proprement quand on conçoit une application Java utilisable en ligne de commande.
En effet la plupart du temps quand on devait créer une telle application, on créait une méthode un peu comme cela :
public static void main(String[] args){
Class instance = new Class();
// récupération du nom de l'individu :
instance.nom = args[0];
// récupération de l'age de l'individu :
instance.age = Integer.valueOf(args[1]);
// récupération du boolean vie/mort :
instance.isMort = Boolean.valueOf(args[2]);
}
En supposant bien sûr aucune vérification, aucune robustesse, et surtout un code on ne peut plus clair...
Args4j permet de mettre un peu plus de formalisme derrière tout ça, ainsi on va pouvoir rapprocher l'utilisation d'un programme java de celui de n'importe quel script sh ou python utilisable sous unix (avec des paramètres de la forme --name "Olivier").
La seule contrainte est de définir les paramètres que va devoir traiter args4j en tant que variables membres de la classe, ce qui reste une toute petite contrainte face à l'économie de prise de tête que représente l'outil.
Ainsi pour reprendre mon exemple avec un individu, on va reformater les élèments du programme sous cette forme :
import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;
import org.kohsuke.args4j.spi.IntOptionHandler;
import org.kohsuke.args4j.spi.BooleanOptionHandler;
import java.io.IOException;
public class Individu {
@Option(name = "-n",aliases = {"--name"},usage="Sets a name for the person", required = true)
private String nom;
@Option(name = "-y", aliases = {"--years"},handler= IntOptionHandler.class, usage ="Define the person's age" )
private Integer age;
@Option(name="--isdead", handler = BooleanOptionHandler.class, usage = "Define if the person is dead")
private boolean isMort;
public void doMain(String[] args) throws IOException {
CmdLineParser parser = new CmdLineParser(this);
try {
// parse the arguments.
parser.parseArgument(args);
} catch( CmdLineException e ) {
System.err.println(e.getMessage());
// on va réafficher les possibilités d'arguments du programme
parser.printUsage(System.err);
return;
}
}
public static void main(String[] args) throws IOException{
Individu jean = new Individu();
jean.doMain(args);
}
}
Grâce à ce simple code et le tag des variables dont on avait besoin, ainsi que la définition de handler vérifiant que les paramètres donnés sont bel et bien du type attendu ou tout simplement qu'ils sont présent.
Ainsi le code ci-dessus une fois utilisé en ligne de commande donne le résultat suivant :

Il est encore plus intéressant de pouvoir définir ses propres handler, et de pouvoir appliquer cette notion d'Options à des méthodes qui se chargeront de remplir plusieurs paramètres à la fois. Enfin tout ça vous pourrez le découvrir si vous vous intéressez un peu plus à la librairie que l'on doit à Kohsuke Kawaguchi.
Newsletter
Stay updated with new articles.
Keep reading

Langage de programmation : Comme si les performances comptaient ...
Comme j'anticipe le gros troll qui pourrait découler d'un tel titre, je vais préciser ma pensée : Je ne veux pas dire qu'il ne faut pas optimiser son code autant que faire se peut et qu'il n'est pas n...
May 13, 2009Evitons Javascript
S'il y a bien une chose qui semble évidente si on regarde le monde du web actuel se dessiner, c'est que (presque) tous les frameworks actuels tentent d'**éliminer complètement Javascript**des préoccup...
Sep 8, 2010Introduction et prise en main de PyQt/PySide
Bonjour, j'ai peu bloggé ces temps-ci entre mes contributions pour Virgo, un sprint Django que je suis en train de finir, et mes rédactions d'articles pour développez.net. Pour me rattraper, j'ai déci...
Aug 26, 2010
No comments yet. Be the first to comment!