lundi 31 décembre 2012

Différence entre la classe Properties et ResourceBundle

Lorsqu'il est nécessaire de mettre dans un fichier des paramètres de configuration, deux possibilités principales s'offrent, en Java, au développeur.

Bien souvent, un fichier de configuration sera de la forme suivante :
clef=valeur
Les deux classes Properties et ResourceBundle permettent de lire ce type de fichier. Mais quelle est donc la différence ?

Le cas Properties

La classe Properties charge son contenu à partir d'un flux. Exemple :
Properties prop = new Properties() ;
     
try {
 prop.load(this.getClassLoader().getResourceAsStream("file.properties")) ;   
} catch (IOException e) {
 e.printStackTrace() ;
}
Il apparait que le fichier doit être chargé par le développeur.
Il n'y a donc qu'un fichier.
Si pour une raison, le fichier change suivant le contexte, le développeur doit indiquer un autre nom.

Le cas ResourceBundle

La classe ResourceBundle permet la localisation, c'est à dire permet de prendre un fichier en fonction de certains paramètres.

La localisation permet de définir des valeurs suivant le contexte.

Exemple :
Locale locale_fr = new Locale("fr", "FR") ;
Locale locale_us = new Locale("us", "US") ;
A présent, un fichier de paramétrage doit être chargé. Ce fichier dépend de l’environnement (langue) car il contient les libellées d'une page web.
Locale locale_fr = new Locale("fr", "FR") ;
ResourceBundle messages = ResourceBundle.getBundle("messages", locale_fr) ;
La classe ResourceBundle va donc chercher le premier fichier dans l'ordre suivant :
messages_fr_FR.properties
messages_fr.properties
messages.properties
Il est a noter que la classe ResourceBundle ajoute automatiquement les constantes et l'extension du fichier.

Ce principe peux aussi s'appliquer à des environnements techniques :
Locale locale_unix = new Locale("UNIX");
Locale locale_windows = new Locale("WINDOWS");
Dans lequel pourra être mis, la commande pour invoquer un shell par exemple.

Conclusion

La classe Properties sera principalement utilisée pour stocker des données sans contexte (la liste d'un id avec une url par exemple) alors que ResourceBundle sera plus utilisé pour des données qui changent suivant un contexte/environnement.

vendredi 14 décembre 2012

Indiquer une classe de lancement par défaut dans un jar

Régulièrement, sur les forums, des personnes se demandent comment, il est possible de définir une classe de lancement par défaut dans un jar.

Pour indiquer à la JVM un classe de lancement par défaut, il faut dans le fichier META-INF/MANIFEST.MF :
Main-Class: org.test.ClassMain
Si vous utiliser Maven, il est posssible directement avec le plugin maven-jar-plugin de le spécifier comme ci-dessous :
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.maventest</groupId>
 <artifactId>aproject</artifactId>
 <packaging>jar</packaging>
 <version>1.0-SNAPSHOT</version>
 <name>aproject</name>
 <url>http://maven.apache.org</url>
 <build>
  <plugins>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
     <archive>
      <manifest>
       <mainClass>org.test.ClassMain</mainClass>
      </manifest>
     </archive>
    </configuration>
   </plugin>
  </plugins>
 </build>
</project>