lundi 11 mai 2009

Maven - native2ascii

native2ascii est un outil fourni avec le jdk permettant de convertir des fichiers contenant des caractères natifs vers un fichier "unicode" (les caractères non ascii du nouveau fichier seront sous la forme "\udddd").
Il existe un plugin maven permettant d'effectuer cette conversion. Malheureusement, il n'est pas très pratique. Par défaut, il ne convertit que les fichiers issus du répertoire "src/main/native2ascii" et curieusement les fichiers convertis ne sont pas inclus dans le jar. De plus, il n'y a pas de "token replacement" ce qui peut poser problème. Il faut donc régler ça de façon à ce que d'une part nous puissions convertir nos fichiers de ressources après le remplacement des tokens, et d'autre part pouvoir inclure le fichier converti dans le jar (ou le war).
La première étape est de paramétrer le plugin au niveau du pom parent. Nous allons avoir besoin du plugin antrun.
Dans le pom parent :


<properties>
<native2ascii.includes>**/*.properties</native2ascii.includes>
<native2ascii.encoding>UTF-8</native2ascii.encoding>
</properties>

<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<inherited>true</inherited>
<dependencies>
<dependency>
<groupId>sun</groupId>
<artifactId>tools</artifactId>
<version>1.5.0</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>native2ascii-maven-plugin</artifactId>
<inherited>true</inherited>
<dependencies>
<dependency>
<groupId>sun</groupId>
<artifactId>tools</artifactId>
<version>1.5.0</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
</dependencies>
</plugin>
</plugins>
</pluginManagement>
</build>

La propriété "native2ascii.encoding" indique l'encoding des fichiers sources, l'autre propriété nous permet d'indiquer les fichiers à convertir. Notez qu'il faut inclure rt.jar dans le path.
Dans le pom ou la conversion doit avoir lieu :

<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>native2ascii-maven-plugin</artifactId>
<inherited>true</inherited>
<executions>
<execution>
<phase>process-resources</phase>
<goals>
<goal>native2ascii</goal>
</goals>
<configuration>
<encoding>${native2ascii.encoding}</encoding>
<dest>/target/native2ascii</dest>
<src>/target/classes</src>
<includes>${native2ascii.includes}</includes>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<inherited>true</inherited>
<executions>
<execution>
<id>native2ascii</id>
<phase>process-resources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<copy
todir="${basedir}/target/classes"
overwrite="true">
<fileset
dir="${basedir}/target/native2ascii" />
</copy>
<delete
dir="${basedir}/target/native2ascii" />
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

L'idée est de convertir les fichiers de target/classes, qui auront été copiés par maven et où le "token replacement" aura eu lieu. Ensuite, nous récupérons les fichiers convertis pour remplacer les fichiers existants dans la tâche ant. Ainsi les fichiers seront correctement inclus dans le jar/war.