Maven управляет зависимостями
1. Как библиотеки зависят друг от друга в 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. Удалить дубликаторы библиотек
При объявлении библиотеки в 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
Руководства Maven
- Установите Maven для Eclipse
- Руководство Maven для начинающих
- Maven управляет зависимостями
- Построить Multiple Module Project с Maven
- Запускать веб-приложение Java Maven в Tomcat Maven Plugin
- Запуск веб-приложения Java Maven в Jetty Maven Plugin
- Установите Tycho для Eclipse
- Создайте проект Java OSGi с Maven и Tycho
- Создайте пустой проект Maven Web App в Eclipse
- Интеграция OSGi и AspectJ
Show More