Utiliser Maven 2
Date de publication : 04/08/2008 , Date de mise à jour : 04/08/2008
7. Resources et filtrage
7.1. Resources
7.2. Filtrage
7.3. Stratégies et risques du filtrage
7.4. Stratégie de selection des ressources
7. Resources et filtrage
7.1. Resources
Dans un projet Maven, src/main/java correspond au répertoire principal dans
lequel doit se trouver toutes les sources applicatives du projet. Néammoins il
est très courant d'avoir des fichiers de configuration à positionner dans le
classpath.
Le répertoire src/main/resources répond à cette attente. Il s'agit d'un autre
répertoire qui sera compilé et ajouté au classpath. Son rôle est de contenir
l'ensemble des fichiers de configuration du projet.
Le répertoire src/main/resources est configuré par défaut dans Maven comme étant
un répertoire de ressource. Pour en ajouter un autre il est possible d'ajouter
au pom le code suivant :
Configuration pour ajouter un répertoire de ressources |
< build >
...
< resources >
< resource >
< directory > src/main/config< / directory >
< / resource >
< / resources >
...
< / build >
|
7.2. Filtrage
Mais les resources n'ont pas pour seul objectif de séparer les fichiers de conf
pour amméliorer la visibilité. Même si ce n'est pas activé par défaut, le
principal atout est de pouvoir réaliser du filtrage sur ces fichiers.
Filtrer les fichiers correspond à remplacer à l'intérieur de tous les fichiers
et à chaque compilation tous les ${properties} par leur valeur. Pour activer le
filtrage sur un répertoire de resources, il faut ajouter le code suivant :
Configuration pour filtrer un répertoire de ressources |
< build >
< resources >
< resource >
< directory > src/main/resources< / directory >
< filtering > true< / filtering >
< / resource >
< / resources >
< / build >
|
Par défaut, les properties qui seront utilisés pour le filtrage sont les
properties actifs dans Maven, il y en a plusieurs positionnées par défaut tel
que pom.name, pom.version...
Il est possible d'ajouter un fichier de properties qui sera utilisé pour le
filtrage. Ils sont alors positionné par convention dans le répertoire
src/main/filters et se configure avec le code suivant :
Configuration pour utiliser un fichier properties de filtrage |
< build >
< filters >
< filter > src/main/filters/filter.properties< / filter >
< / filters >
< / build >
|
7.3. Stratégies et risques du filtrage
Le filtrage a été fait pour gérer les configuration par environnements pour les
projets. Il y a plusieurs stratégies possible pour gérer les environnements :
-
Sélectionner le fichier de filtrage en fonction de l'environnement :
<filter>src/main/filters/${env}.properties</filter>
-
Gérer des profils (voir le chapitre consacrés aux profils) afin de
positionner des properties par profils.
Quelque soit la solution utilisée, cela permet de sélectionner l'environnement
pour lequel on veut configurer l'application et les fichiers de configuration
seront automatiquement positionnés avec les bonnes valeurs.
Le risque de cette méthode réside dans la phase de développement. Si dans la
phase de développement, la gestion de la compilation n'est pas gérée par Maven,
le filtrage ne sera pas effectué. Comme les fichiers du répertoire resources
seront remplis de ${bdd.url} (par exemple) ils ne pourront être utilisés
directement.
L'utilisation des filtres lie donc le développeur avec le mécanisme de
compilation de Maven.
7.4. Stratégie de selection des ressources
Il peut être intéressant de choisir un répertoire de ressources avec un nom
dépendant de l'environnement :
Configuration d'un répertoire de ressource dépendant de l'environnement |
< build >
< resources >
< resource >
< directory > src/main/resources-${env}< / directory >
< / resource >
< / resources >
< / build >
|
L'avantage est que si l'IDE ne gère pas le filtrage, il est possible de lui
donner le répertoire de ressources à utiliser en local, il ne connaitra pas les
ressources pour les autres environnements mais cela ne l'empechera pas de
fonctionner correctement.
Cela nécessite par contre de dupliquer tous les fichiers de configuration
présent dans ces répertoires pour en avoir une version dans chaque répertoire.
|
Dans notre projet, nous allons rajouter en ressource le fichier de configuration
log4j.properties pour qu'il soit filtré en fonction de l'environnement.
Pour cela, on précise que le répertoire resources doit être filtré, que le fichier
de filtrage est ${env}.properties.
Afin de donner une valeur par défaut à la variable env, on rajoute la balise
properties au bas du pom. Si une valeur est donnée à la variable env par la commande
"-Denv=xxx" elle sera prioritaire.
|
Configuration pour utiliser un filtre par environnement |
< 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.developpez< / groupId >
< artifactId > cours-maven-example< / artifactId >
< packaging > jar< / packaging >
< name > Projet d'exemple pour le cours Maven< / name >
< version > 1.0< / version >
< dependencies >
< dependency >
< groupId > log4j< / groupId >
< artifactId > log4j< / artifactId >
< version > 1.2.13< / version >
< / dependency >
< / dependencies >
< build >
< resources >
< resource >
< directory > src/main/resources< / directory >
< filtering > true< / filtering >
< / resource >
< / resources >
< filters >
< filter > src/main/filters/${env}.properties< / filter >
< / filters >
< plugins >
< plugin >
< groupId > org.apache.maven.plugins< / groupId >
< artifactId > maven-compiler-plugin< / artifactId >
< version > 2.0.2< / version >
< configuration >
< source > 1.5< / source >
< target > 1.5< / target >
< / configuration >
< / plugin >
< / plugins >
< / build >
< properties >
< env > LOCAL< / env >
< / properties >
< / project >
|
|
Dans les fichiers, on rajoute le fichier
src/main/resources/log4j.properties
ainsi :
|
Exemple de fichier de ressource filtré |
log4j.rootLogger=${log.level}, CONSOLE_APP
log4j.appender.CONSOLE_APP=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE_APP.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE_APP.layout.ConversionPattern= %d{dd-MM-yyyy HH:mm:ss:SSS} %-4r %-5p %c %x - %m%n
|
|
On crée les fichiers
src/main/filters/LOCAL.properties
et
src/main/filters/PROD.properties
dans lesquels on définit la clé
log.level
dans le premier à
DEBUG
, dans le second à
WARN
.
Après compilation par
mvn compile
, on trouvera le fichier
target/classes/log4j.properties
|
Exemple de fichier après le filtrage |
log4j.rootLogger=DEBUG, CONSOLE_APP
log4j.appender.CONSOLE_APP=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE_APP.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE_APP.layout.ConversionPattern= %d{dd-MM-yyyy HH:mm:ss:SSS} %-4r %-5p %c %x - %m%n
|
|
Après compilation par
mvn compile -Denv=PROD
, on trouvera le fichier
target/classes/log4j.properties
|
Exemple de fichier après le filtrage |
log4j.rootLogger=WARN, CONSOLE_APP
log4j.appender.CONSOLE_APP=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE_APP.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE_APP.layout.ConversionPattern= %d{dd-MM-yyyy HH:mm:ss:SSS} %-4r %-5p %c %x - %m%n
|
Les sources présentés sur cette pages sont libre de droits, et vous pouvez les utiliser à
votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Copyright Matthieu Lux . Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu
: textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous
encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets.