IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

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 doivent 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>
				
info Gestion des resources

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.

idea 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>
			
idea 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
			
idea 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
			
idea 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
			
 

Valid XHTML 1.1!Valid CSS!

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.