Ce site met a disposition le build journalier de la traduction francaise du Maven: The Definitive Guide
Consultez :
  • Les documents de reference sur le projet original
  • Les sources de la traduction fr sur GitHub
  • maven


    15.3. Filtrage des ressources

    Vous pouvez utiliser Maven pour remplacer des variables dans les ressources d'un projet par leur véritable valeur. Lorsque cette fonctionnalité de filtrage des ressources est activée, Maven parcourt les ressources à la recherche de références à des propriétés. Lorsque Maven trouve l'une de ces références, il remplace celle-ci par la valeur appropriée selon un mécanisme similaire aux propriétés définies dans un POM. Cette fonctionnalité est très pratique pour paramétrer un build avec différentes valeurs de configuration selon la plateforme cible.

    Il est fréquent qu'un fichier .properties ou qu'un document XML présent dans le répertoire src/main/resources contienne des références vers des ressources externes du type base de données ou emplacement réseau qui doivent être configurées différemment en fonction de l'environnement cible. Par exemple, un système qui fait appel à une base de données aura un fichier de configuration qui contiendra l'URL JDBC, le nom d'utilisateur et le mot de passe permettant de s'y connecter. Si vous avez besoin d'utiliser une base de données différente en développement, vous pouvez soit utiliser une technologie du type JNDI pour externaliser votre configuration, soit utiliser un mécanisme de build qui saura remplacer les différentes variables par les valeurs correspondant à la plateforme cible.

    En utilisant le filtrage des ressources, vous pouvez référencer des propriétés Maven et les spécifier dans les profils pour définir différentes valeurs de configuration selon les environnements cibles. Pour illustrer cela, prenons l'exemple d'un projet qui utilise Spring pour configurer une BasicDataSource à partir du projet Commons DBCP. Ce projet contient un fichier nommé applicationContact.xml dans le répertoire src/main/resources qui possède le contenu XML de l'Exemple 15.3, « Référencer des propriétés Maven à partir d'une ressource ».

    Exemple 15.3. Référencer des propriétés Maven à partir d'une ressource

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    
        <bean id="someDao" class="com.example.SomeDao">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <bean id="dataSource" destroy-method="close" 
                 class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="${jdbc.driverClassName}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
    </beans>

    Votre programme utilisera ce fichier lors de son exécution. Avant cela, votre build remplacera les références des différentes propriétés (jdbc.url, jdbc.username, ...) par les valeurs définies dans votre fichier pom.xml. Le filtrage des ressources est désactivé par défaut pour vous éviter de mauvaises surprises. Aussi, pour activer cette fonctionnalité, vous devez modifier le contenu de la balise resources dans votre POM. Dans l'Exemple 15.4, « Définition de variables et activation du filtrage des ressources », le POM définit les variables utilisées dans l'Exemple 15.3, « Référencer des propriétés Maven à partir d'une ressource » et active le filtrage des ressources pour tout le répertoire src/main/resources.

    Exemple 15.4. Définition de variables et activation du filtrage des ressources

    <project>
      ...
      <properties>
        <jdbc.driverClassName>
          com.mysql.jdbc.Driver</jdbc.driverClassName>
        <jdbc.url>jdbc:mysql://localhost:3306/development_db</jdbc.url>
        <jdbc.username>dev_user</jdbc.username>
        <jdbc.password>s3cr3tw0rd</jdbc.password>
      </properties>
      ...
      <build>
        <resources>
          <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
          </resource>
        </resources>
      </build>
      ...
      <profiles>
        <profile>
          <id>production</id>
          <properties>
            <jdbc.driverClassName>oracle.jdbc.driver.OracleDriver</jdbc.driverClassName>
            <jdbc.url>jdbc:oracle:thin:@proddb01:1521:PROD</jdbc.url>
            <jdbc.username>prod_user</jdbc.username>
            <jdbc.password>s00p3rs3cr3t</jdbc.password>
          </properties>
        </profile>  
      </profiles>
    </project>

    Les quatre variables sont définies dans la balise properties et le filtrage des ressources est activé pour les ressources du répertoire src/main/resources. Pour activer la fonctionnalité de filtrage, vous devez affecter la valeur true à la balise filtering pour chaque répertoire que vous désirez filtrer. La construction d'un projet contenant les ressources de l'Exemple 15.3, « Référencer des propriétés Maven à partir d'une ressource » et le POM de l'Exemple 15.4, « Définition de variables et activation du filtrage des ressources » va créer dans le répertoire target/classes le fichier suivant, vous remarquerez d'ailleurs que toutes les propriétés ont bien été remplacées :

    $ mvn install
    ...
    $ cat target/classes/applicationContext.xml
    ...
        <bean id="dataSource" destroy-method="close" 
                 class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/development_db"/>
            <property name="username" value="dev_user"/>
            <property name="password" value="s3cr3tw0rd"/>
        </bean>
    ...

    Le POM de l'Exemple 15.4, « Définition de variables et activation du filtrage des ressources » définit également le profil production. Celui-ci surcharge les propriétés par défaut avec des valeurs appropriées à l'environnement de production. Dans ce POM, la configuration par défaut des connexions à la base de données cible une base de données MySQL locale installée sur la machine du développeur. Lorsque ce projet est construit avec le profil 'production' activé, Maven mettra à jour cette configuration pour se connecter à une base de données Oracle en utilisant un autre driver, une autre URL, et un autre couple utilisateur / mot de passe. Si vous construisez un projet avec la ressource de l'Exemple 15.3, « Référencer des propriétés Maven à partir d'une ressource », le POM de l'Exemple 15.4, « Définition de variables et activation du filtrage des ressources » et le profil 'production' activé lorsque vous listerez le contenu du répertoire target/classes vous constaterez qu'il contient un fichier correctement filtré avec les valeurs de production :

    $ mvn -Pproduction install
    ...
    $ cat target/classes/applicationContext.xml
    ...
        <bean id="dataSource" destroy-method="close" 
                 class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" 
                         value="oracle.jdbc.driver.OracleDriver"/>
            <property name="url" value="jdbc:oracle:thin:@proddb01:1521:PROD"/>
            <property name="username" value="prod_user"/>
            <property name="password" value="s00p3rs3cr3t"/>
        </bean>
    ...