Maven управляет зависимостями

1- How are the libraries interdependent in Maven

Maven - отличный инструмент, который поможет вам исследовать мир с открытым исходным кодом на Java. Но иногда, вы не достаточно понимаете о Maven, чтобы контролировать его. И поэтому может быть какая-то необъяснимая ошибка.
В этом документе я расскажу вам, как избежать дублирования библиотеки в Maven.
Чтобы упростить работу, вы должны увидеть содержимое следующего файла pom.xml:
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>
Файл pom.xml, указанный выше, объявленный с использованием библиотеки javax.servlet.jsp.jstl, эта библиотека зависит от jstl-api. И jstl-api зависит от двух библиотек: servlet-api и jsp-api. Зависимость похожа на приведенную ниже иллюстрацию:
В  Eclipse вы можете увидеть это дерево зависимостей:
Библиотека, которая будет использоваться, - это библиотека, которую вы объявили в Maven и зависимые библиотеки.

2- Exclude duplicate library

При объявлении библиотеки в Maven может произойти дублирование библиотеки. Например, вы объявляете использование двух библиотек A и B с Maven. A зависит от C и D, а B зависит от C и E. Это означает дубликат библиотеки C. Вы можете увидеть иллюстрацию ниже.
На приведенном выше рисунке показано, что будут использоваться две версии библиотеки C, что может привести к ошибкам во время выполнения приложения. Вам нужно настроить, чтобы удалить одну из двух версий библиотеки C. Обычно вы должны удалить более старую версию.
 
Использование <exclusions> для удаления зависимых библиотек, которые вы не хотите использовать.
<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>
Инструменты Eclipse поддерживают обнаружение и устранение дублирования. Возьмем пример:
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>
 Щелкните правой кнопкой мыши зависимую библиотеку, которую нужно исключить, и выберите Exclude Maven Artifact...
Eclipse автоматически добавит код < exclusions> в pom.xml:
Теперь здесь нет библиотеки дублирования в вашем файле  pom.xml