Maven управляет зависимостями
View more Tutorials:
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 и зависимые библиотеки.
При объявлении библиотеки в 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
