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


    9.4.2. Dépendances optionnelles

    Supposons que vous travaillez sur une bibliothèque qui fournit un service de cache. Au lieu d'écrire votre propre système de cache en partant de zéro, vous voulez utiliser certaines des bibliothèques existantes qui gèrent un cache sur le système de fichiers ou un cache distribué. Supposons encore que vous voulez permettre à l'utilisateur final de choisir entre un cache sur le système de fichiers et un cache distribué en mémoire. Vous voulez utiliser la bibliothèque libre EHCache (http://ehcache.sourceforge.net/) pour le cache sur le système de fichiers, et pour le cache distribué en mémoire, vous voulez utiliser SwarmCache (http://swarmcache.sourceforge.net/), une autre bibliothèque libre. Vous allez écrire une interface et créer une bibliothèque qui pourra être configurée pour utiliser EHCache ou SwarmCache, cependant vous ne voulez pas ajouter une dépendance vers ces deux bibliothèques de cache dans chaque projet qui dépendrait de votre bibliothèque.

    En d'autres termes, vous avez besoin de ces deux bibliothèques à la compilation de votre projet, mais vous ne voulez pas que toutes les deux apparaissent comme des dépendances transitives nécessaires à l'exécution dans un projet qui utiliserait votre bibliothèque. Vous pouvez réaliser cela en utilisant des dépendances optionnelles comme dans l'Exemple 9.4, « Déclaration de dépendances optionnelles ».

    Exemple 9.4. Déclaration de dépendances optionnelles

    <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>org.sonatype.mavenbook</groupId>
      <artifactId>my-project</artifactId>
      <version>1.0.0</version>
      <dependencies>
        <dependency>
          <groupId>net.sf.ehcache</groupId>
          <artifactId>ehcache</artifactId>
          <version>1.4.1</version>
          <optional>true</optional>
        </dependency>
        <dependency>
          <groupId>swarmcache</groupId>
          <artifactId>swarmcache</artifactId>
          <version>1.0RC2</version>
          <optional>true</optional>
        </dependency>
        <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.13</version>
        </dependency>
      </dependencies>
    </project>

    Une fois que vous avez déclaré ces dépendances comme optionnelles, vous devrez les ajouter de manière explicite dans les projets qui dépendront de my-project. Par exemple, si vous écrivez une application qui dépend de my-project et que vous voulez utiliser l'implémentation EHCache, vous devrez ajouter la balise dependency suivante à votre projet.

    <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>org.sonatype.mavenbook</groupId>
      <artifactId>my-application</artifactId>
      <version>1.0.0</version>
      <dependencies>
        <dependency>
          <groupId>org.sonatype.mavenbook</groupId>
          <artifactId>my-project</artifactId>
          <version>1.0.0</version>
        </dependency>
        <dependency>
          <groupId>net.sf.ehcache</groupId>
          <artifactId>swarmcache</artifactId>
          <version>1.4.1</version>
        </dependency>
      </dependencies>
    </project>

    Dans un monde idéal, vous ne devriez pas avoir besoin de dépendances optionnelles. Au lieu d'avoir un gros projet avec un ensemble de dépendances optionnelles, vous devriez isoler le code spécifique à EHCache dans un sous-module my-project-ehcache et le code spécifique à SwarmCache dans un autre sous-module my-project-swarmcache. Ainsi, les projets qui référencent my-project et qui doivent ajouter une dépendance spécifique, pourraient référencer une dépendance vers une implémentation spécifique et bénéficieraient ainsi des dépendances transitives.