lundi 26 août 2013

Fichier de propriétés Maven mal encodé. [2/2]

Pourquoi donc, lorsque le fichier est chargé l'encodage n'est pas bon ?

Si on reprend le code et que l'on va plus loin :
public static Properties loadPropertyFile( File propFile, Properties baseProps )
    throws IOException
{
    if ( !propFile.exists() )
    {
        throw new FileNotFoundException( propFile.toString() );
    }
    final Properties fileProps = new Properties();
    final FileInputStream inStream = new FileInputStream( propFile );
    try {
        fileProps.load(inStream) ;
    }
 ....

On constate que c'est la classe java.util.Properties qui charge les fichiers de propriétés.
Or dans la java doc (http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html) on lit :
"except the input/output stream is encoded in ISO 8859-1 character encoding"

"The native2ascii tool can be used to convert property files to and from other character encodings."

Donc, la classe java.util.Properties ne gère que l'ISO 8859-1.
Pour palier ce problème, depuis java 1.6, il existe une méthode public synchronized void load(Reader reader) throws IOException qui prend un objet type java.io.BufferedReader qui couplé avec java.io.InputStreamReader permet le support d'encodage différent.
Cet encodage différent peut soit être configuré via le constructeur, soit via -Dfile.encoding=UTF8.

lundi 12 août 2013

Fichier de propriétés Maven mal encodé. [1/2]

Avec Maven, il est possible de spécifier un fichier de propriétés qui sera utilisé par la suite pour faire du filtrage de fichiers.
Ce fichier, contient la liste des variables à valoriser.

Par exemple, si dans le fichier local.properties, il y a :
titre=En cours de création

Dans le fichier à substituer label.properties, le contenu est le suivant :
monLabel=${titre}

Les deux fichiers sont encodés en UTF8.
Dans le pom.xml, l'encodage est spécifié par :
<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties>

Une fois substitué, le résultat du fichier est :
En cours de création

Il y a donc un problème d'encodage mais où ?

Pour faire simple, le filtering jusqu'à Maven 3.0.x en tout cas se fait via la librairie "maven-filtering".
Et si on regarde le code, classe PropertyUtils méthode loadPropertyFile (c'est cette méthode qui est appelé pour le filtering), on a :
public static Properties loadPropertyFile( File propFile, Properties baseProps )
    throws IOException
{
    if ( !propFile.exists() )
    {
        throw new FileNotFoundException( propFile.toString() );
    }
    final Properties fileProps = new Properties();
    final FileInputStream inStream = new FileInputStream( propFile );
    ....

Il n'est pas prévu de pouvoir spécifier un encodage en particulier pour les fichiers contenant les variables qui devront être filtrés.
Le fichier est ouvert avec l'encodage par défaut de la JVM.

Le soucis, est que si lors du lancement de Maven, on ajoute l'option de la JVM -Dfile.encoding=UTF8 cela ne fonctionne pas.
Pourquoi ?
J'y reviendrais dans un autre billet.

Ticket sur le plugin maven ressource sur ce sujet : https://jira.codehaus.org/browse/MRESOURCES-175