devstory

Maven Gérer les dépendances

  1. Comment les bibliothèques sont interdépendantes à Maven
  2. Exclure la bibliothèque en double

1. Comment les bibliothèques sont interdépendantes à Maven

Maven est un excellent outil qui vous aide à explorer le monde d'open source en Java. Mais parfois, vous ne comprenez pas suffisamment de Maven afin de le contrôler. Et donc il se peut qu'il y ait une erreur inexpliquée.
Dans ce document, je vais vous donner des instructions comment éviter la duplication de la bibliothèuqe dans Maven.
Afin de simplifier des choses, vous devez voir le contenu du fichier pom.xml suivant:
pom.xml
<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>org.o7planning</groupId>
   <artifactId>SimpleMavenWebApp</artifactId>
   <packaging>war</packaging>
   <version>0.0.1-SNAPSHOT</version>
   <name>SimpleMavenWebApp Maven Webapp</name>
   <url>http://maven.apache.org</url>



   <dependencies>

       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>3.8.1</version>
           <scope>test</scope>
       </dependency>

       <!-- JSTL Library -->
       <!-- http://mvnrepository.com/artifact/org.glassfish.web/javax.servlet.jsp.jstl -->

       <dependency>
           <groupId>org.glassfish.web</groupId>
           <artifactId>javax.servlet.jsp.jstl</artifactId>
           <version>1.2.4</version>
       </dependency>

   </dependencies>


   <build>
       <finalName>SimpleMavenWebApp</finalName>
   </build>

</project>
Le fichier pom.xml ci- dessus, vous avez déclaré l'utilistation de la bibliothèque javax.servlet.jsp.jstl, cette bibliothèque dépend du jstl-api. Et jstl-api dépend de deux bibliothèques servlet-api et jsp-api. La dépendance est similaire comme dans l'illustration ci-dessous:
Sur Eclipse, vous pouver voir l'arborescence de cette dépendance:
La bibliothèque qui sera utilisée est la bibliothèque que vous avez déclarée à Maven et aux bibliothèques dépendantes.

2. Exclure la bibliothèque en double

Lors de la déclaration de la bibliothèque à Maven, la duplication des bibliothèques peut se produire. Par exemple, vous déclarez l'utilisation de deux bibliothèques A et B avec Maven. A dépend de C et D, et B dépend de C et E. Cela signifie que la duplication de la bibliothèque C. Vous pouvez voir l'illustration ci-dessous.
L'illustration ci-dessus montre qu'il existe deux versions de la bibliothèque C, qui peuvent provoquer des erreurs dans l'exécution de l'application. Vous devez configurer pour supprimer une des deux versions de la bibliothèque C. Normalement, vous devez supprimer l'ancienne version.

L'utilisation de <exclusions> pour supprimer les bibliothèques dépendantes que vous ne souhaitez pas utiliser.
<dependencies>

    <dependency>
        <groupId>aa</groupId>
        <artifactId>A</artifactId>
        <version>1.1</version>
    </dependency>

    <dependency>
        <groupId>bb</groupId>
        <artifactId>B</artifactId>
        <version>1.1</version>

        <exclusions>
            <exclusion>
                <artifactId>C</artifactId>
                <groupId>cc</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    
</dependencies>
L'outil d'Eclipse vous fournit de détecter et d'éliminer la duplication. Prennez un exemple:
pom.xml
<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>org.o7planning</groupId>
   <artifactId>SimpleMavenWebApp</artifactId>
   <packaging>war</packaging>
   <version>0.0.1-SNAPSHOT</version>
   <name>SimpleMavenWebApp Maven Webapp</name>
   <url>http://maven.apache.org</url>



   <dependencies>

       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>3.8.1</version>
           <scope>test</scope>
       </dependency>

       <!-- Servlet API - Servlet Library -->
       <!-- http://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
       
       <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>javax.servlet-api</artifactId>
           <version>3.1.0</version>
           <scope>provided</scope>
       </dependency>
       
       
       <!-- JSTL Library -->
       <!-- http://mvnrepository.com/artifact/org.glassfish.web/javax.servlet.jsp.jstl -->

       <dependency>
           <groupId>org.glassfish.web</groupId>
           <artifactId>javax.servlet.jsp.jstl</artifactId>
           <version>1.2.4</version>
       </dependency>

   </dependencies>


   <build>
       <finalName>SimpleMavenWebApp</finalName>
   </build>

</project>
Cliquez avec le bouton droit sur la bibliothèque dépendante qui doit exclure, et sélectionnez Exclude Maven Artifact...
Eclipse va automatiquement ajouter le code <exclusions> dans pom.xml:
Ici, il n'y a pas de bibliothèque de duplication dans votre fichier pom.xml.