Récupérer proprement les paramètres passés à la classe contenant la méthode main

Publié dans Java | Marqué avec , ,
Share

Dans un précédent billet, j’ai expliqué comment lancer une classe Java à partir d’un fichier .bat. Aujourd’hui, on va voir comment récupérer facilement les paramètres fournis à la classe Java par le .bat.
En gros, nous allons essayer de récupérer les paramètres fournis par la commande suivante :

java MaClasse.java param1 param2 ...

J’ai volontairement zappé le chemin vers la classe, les variables d’environnement, bref, tout ce que j’ai expliqué dans le billet lancer une classe Java à partir d’un fichier .bat.

Ce que l’on peut récupérer facilement en Java :

public class MaClasseTest {
	public static void main(String[] args) {
		System.out.println("Argument 1 : "+args[0]+", argument 2 : "+args[1]);
	}
}

Ce qui affiche tranquillement

Argument 1 : param1, argument 2 : param2

C’est plutôt pas mal, mais on peut mieux faire. Par exemple en vérifiant qu’on a bien le bon nombre d’arguments souhaités.

public class MaClasseTest {
	public static void main(String[] args) {
		if (args.size() != 2) {
			System.out.println("Usage : <progname> <param1> <param2>");
			exit(0);
		}
		System.out.println("Argument 1 : "+args[0]+", argument 2 : "+args[1]);
	}
}

Mais tout cela oblige une notion d’ordre qui n’est pas forcément la bienvenue. Pour corriger cela, on peut faire précéder nos paramètres par un flag ou option, qui nous permet de les différencier. La commande bash devient alors :

java MaClasse.java -p1 param1 -p2 param2 ...

Et on va se servir de la classe Options en Java pour récupérer ces paramètres :

public class MaClasseTest {
	public static void main(String[] args) {
		Options options = new Options();
		options.addOption("p1", true, "specifie le paramètre 1");
		options.addOption("p2", true, "specifie le paramètre 2");
		CommandLineParser parser = new BasicParser();
		HelpFormatter formatter = new HelpFormatter();
		String param1 = "";
		String param2 = "";
		try {
			CommandLine line = parser.parse(options, args);
			if (line.hasOption("p1")) {
				param1 = line.getOptionValue("p1");
			}
			if (line.hasOption("p2")) {
				param2 = line.getOptionValue("p2");
			}
		}catch (ParseException e) {
			formatter.printHelp("progname", options);
			System.exit(0);
		}
		System.out.println("Argument 1 : "+param1+", argument 2 : "+param2);
	}
}

Ce qui affiche bien les paramètres si on fournit les 2, ou un petit message d’erreur expliquant l’usage sinon.
A noter qu’on peut aller un peu plus loin encore. En effet, lorsque j’utilise options.addOption("p1", true, "specifie le paramètre 1"), en mettant le deuxième paramètre à true, j’oblige l’utilisateur à rentrer une valeur juste après l’option. Si cette valeur avait été à false, alors la valeur n’est plus obligatoire, on peut se contenter d’un :

public class MaClasseTest {
	public static void main(String[] args) {
		Options options = new Options();
		options.addOption("action", false, "specifie qu'une action sera effectue");
		CommandLineParser parser = new BasicParser();
		HelpFormatter formatter = new HelpFormatter();
		try {
			CommandLine line = parser.parse(options, args);
			if (line.hasOption("action")) {
				// Faire quelque chose
			}
		}catch (ParseException e) {
		    formatter.printHelp("progname", options);
		    System.exit(0);
		}
	}
}

Ce qui peut être utile de temps en temps.

Avec tout ça, je commence à un peu mieux maîtriser MS-DOS ! Mais il ne faut pas se fier aux apparences, je fais surtout du Java en ce moment, j’apprends tout un tas de choses mais je me demande toujours par où je peux commencer pour transformer ce savoir en billet.

Une réponse à Récupérer proprement les paramètres passés à la classe contenant la méthode main

  1. Ping : Lancer Java à partir d'un bash Windows - 30 minutes par jour

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*