III. Args4j▲
Téléchargement▲
Args4j est une API plus récente, et nécessite d'ailleurs un JRE 1.5 au minimum. Cela est dû au fait qu'elle se base sur des annotations pour la définition des arguments.
Elle est disponible ici, sous licence MIT.
Il est aussi possible de l'utiliser via Maven, mais cela nécessite l'ajout du repository dev.java.net, pour ce faire, il suffit de suivre ces indications.
Ensuite, il suffit d'ajouter la dépendance Maven :
<dependencies>
<dependency>
<groupId>
args4j</groupId>
<artifactId>
args4j</artifactId>
<version>
2.0.8</version>
</dependency>
</dependencies>
Définitions des options▲
La première étape est aussi de définir les Option, mais à la différence de CLI, on se base sur des annotations.
public
class
MesOptions {
@Option
(
name =
"-h"
, aliases =
{
"--help"
}
, usage =
"Affiche l'aide"
)
private
boolean
help;
@Option
(
name =
"-v"
, aliases =
{
"--version"
}
, usage =
"Affiche la version"
)
private
boolean
version;
@Option
(
name =
"-l"
, aliases =
{
"--logfile"
}
, metaVar =
"FILE"
, usage =
"Specifie le fichier de trace"
)
private
File logfile;
@Option
(
name =
"-p"
, aliases =
{
"--port"
}
, metaVar =
"PORT"
, required =
true
)
private
int
port;
@Argument
private
List<
String>
argument;
}
Chaque argument est donc annoté par @Option, qui prend divers paramètres tels qu'un nom, divers alias, un message d'usage.
L'annotation @Argument sert à spécifier une liste dans laquelle tout argument qui ne serait pas considéré comme une option sera inséré.
Traitement de la ligne de commande▲
Il faut ensuite traiter la ligne de commande en elle-même :
public
static
void
main
(
String ... args){
MesOptions options =
new
MesOptions
(
);
CmdLineParser parser =
new
CmdLineParser
(
options);
try
{
parser.parseArgument
(
args);
// Utilisation des arguments
}
catch
(
CmdLineException e) {
// Affichage de l'aide
}
}
Il suffit de gérer les exceptions lancées dans le cas où une exception obligatoire n'existe pas, quand un argument avec valeur n'en possède pas ou qu'une option non précisée a été passée.
Il est cependant intéressant de savoir comment les exceptions sont gérées, autrement dit, quelles sont les options qui seront traitées lorsqu'une exception aura été lancée ?
La réponse est : toutes celles qui se trouvaient avant la cause de l'exception.
Ligne de commandes |
Descriptions du problème |
État des options |
Raisons |
---|---|---|---|
-p 42 -l c:\serveur.log --mauvaiseoption |
Une mauvaise option est insérée à la fin |
-p : Initialisée |
Le traitement a été correctement effectué afin d'atteindre le problème |
--mauvaiseoption -p 42 -l c:\server.log |
Une mauvaise option est insérée en tout premier argument |
-p : non initialisée |
L'exception a été lancée avant d'avoir pu traiter les bons arguments |
-v -h -l c:\serveur.log |
L'option -p obligatoire n'est pas fournie |
-l : initialisée |
La vérification des arguments obligatoires se fait après traitement de la ligne complète |
-p TEST -l c:\serveur.log |
La valeur de l'option -p n'est pas dans un format correct |
-p : non initialisée |
La traitement de -p a échoué, donc le traitement s'arrête |
Utilisation des arguments▲
Ici, il n'y a pas de traitement spécial : en effet lors du traitement par Args4j, les valeurs des arguments ont été placées dans les champs associés, il suffit donc de travailler directement sur ceux-ci.
public
static
void
main
(
String ... args){
MesOptions options =
new
MesOptions
(
);
CmdLineParser parser =
new
CmdLineParser
(
options);
try
{
parser.parseArgument
(
args);
if
(
options.isHelp
(
)){
// Affichage de l'aide
}
if
(
options.isVersion
(
)){
// Affichage de la version
}
MonServeur server =
new
MonServeur
(
options.getPort
(
), options.getLogfile
(
)) ;
}
catch
(
CmdLineException e) {
// Affichage de l'aide
}
}
Affichage de l'usage▲
public
static
void
main
(
String ... args){
MesOptions options =
new
MesOptions
(
);
CmdLineParser parser =
new
CmdLineParser
(
options);
try
{
parser.parseArgument
(
args);
if
(
options.isHelp
(
)){
// Affichage de l'aide
}
if
(
options.isVersion
(
)){
// Affichage de la version
}
MonServeur server =
new
MonServeur
(
options.getPort
(
), options.getLogfile
(
)) ;
}
catch
(
CmdLineException e) {
parser.setUsageWidth
(
80
);
parser.printUsage
(
System.out);
}
}
L'affichage de l'aide se fait via la méthode printUsage(OutputStream) de l'objet CmdLineParser.
Il est possible d'internationaliser l'aide, en passant un deuxième paramètre de type RessourceBundle à la méthode printUsage. Dès lors, s'il existe une entrée pour l'usage, celui-ci sera affiché dans la langue voulue.
Création d'un Handler▲
Une des valeurs ajoutées de Args4j par rapport à CLI est qu'elle permet de créer des handlers pour des types particuliers.
Il n'y a par exemple pas d'Handler pour les URL ou les Date, mais il est assez simple de les créer :
public
class
URLOptionHandler extends
OptionHandler {
public
URLOptionHandler
(
CmdLineParser cmdLineParser, OptionDef optionDef, Setter setter) {
super
(
cmdLineParser, optionDef, setter);
}
public
int
parseArguments
(
Parameters parameters) throws
CmdLineException {
try
{
// Récupération de la première valeur de l'option
// Création d'une URL et ajout dans la liste des valeurs
String value =
parameters.getParameter
(
0
);
setter.addValue
(
new
URL
(
value));
// Renvoie le nombre de paramètres utilisés
return
1
;
}
catch
(
MalformedURLException e) {
e.printStackTrace
(
); //To change body of catch statement use File | Settings | File Templates.
throw
new
CmdLineException
(
e);
}
}
public
String getDefaultMetaVariable
(
) {
// Spécifie la valeur par défaut qui sera utilisé dans l'usage pour le paramètre de l'option
return
"URL"
;
}
}
public
class
DateOptionHandler extends
OptionHandler {
public
DateOptionHandler
(
CmdLineParser cmdLineParser, OptionDef optionDef, Setter setter) {
super
(
cmdLineParser, optionDef, setter);
}
public
int
parseArguments
(
Parameters parameters) throws
CmdLineException {
try
{
String value =
parameters.getParameter
(
0
);
SimpleDateFormat sdf =
new
SimpleDateFormat
(
"yyyyMMdd"
);
setter.addValue
(
sdf.parse
(
value));
return
1
;
}
catch
(
ParseException e) {
throw
new
CmdLineException
(
"Bad date format, use date like 20070625"
, e);
}
}
public
String getDefaultMetaVariable
(
) {
return
"YYYYMMDD"
;
}
}
Leur utilisation est tout aussi simple :
@Option
(
name=
"-d"
,handler =
DateOptionHandler.class
, usage =
"Speficie une date"
)
private
Date date;
@Option
(
name=
"-u"
, handler =
URLOptionHandler.class
)
URL url;
Annexes : Handlers fourni par Args4j▲
Classe / type |
Handler |
---|---|
File |
FileOptionHandler |
String |
StringOptionHandler |
int |
IntOptionHandler |
double |
DoubleOptionHandler |
Enum |
EnumOptionHandler |