Перейти к основному содержимому

Необязательная зависимость в Maven

· 2 мин. чтения

1. Обзор

В этом кратком учебном пособии описывается тег <Optional> Maven и то, как мы можем использовать его для уменьшения размера и объема артефакта проекта Maven, такого как WAR, EAR или JAR.

Чтобы освежить в памяти Maven, ознакомьтесь с нашим подробным руководством .

2. Что такое <необязательный> ?

Иногда мы создаем проект Maven, который будет зависеть от других проектов Maven. При работе над таким проектом может потребоваться включить одну или несколько зависимостей, которые полезны только для подмножества функций этого проекта.

Если конечный пользователь не использует это подмножество функций, проект по-прежнему транзитивно извлекает эти зависимости. Это излишне увеличивает размер пользовательского проекта и может даже привести к конфликту версий зависимостей с другими зависимостями проекта.

В идеале мы должны разделить подмножество функций проекта на отдельный модуль и, следовательно, не загрязнять остальную часть проекта. Однако это не всегда практично.

Чтобы исключить эти специальные зависимости из основного проекта, мы можем применить к ним тег <Optional> Maven . Это заставляет любого пользователя, который хочет использовать эти зависимости, объявлять их явно. Однако он не принудительно включает эти зависимости в проект, которому они не нужны.

3. Как использовать <необязательно>

Как мы увидим, мы можем включить элемент <Optional> со значением true , чтобы сделать любую зависимость Maven необязательной.

Предположим, у нас есть следующий проект pom:

<project>
...
<artifactId>project-with-optionals</artifactId>
...
<dependencies>
<dependency>
<groupId>com.foreach</groupId>
<artifactId>optional-project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>

В этом примере, несмотря на то, что option-project помечен как необязательный, он остается полезной зависимостью от project-with-Options , как если бы тега <Optional> никогда не было.

Чтобы увидеть эффект тега <Optional> , нам нужно создать новый проект, который зависит от project-with-Options :

<project>
...
<artifactId>main-project</artifactId>
...
<dependencies>
<dependency>
<groupId>com.foreach</groupId>
<artifactId>project-with-optionals</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

Теперь, если мы попытаемся сослаться на необязательный проект из основного проекта , мы увидим, что необязательный проект не существует. Это связано с тем, что тег <Optional> предотвращает его транзитивное включение.

Если мы обнаружим, что нам нужен option-project в нашем main-project , нам просто нужно объявить его как зависимость.

4. Вывод

В этой статье мы рассмотрели тег Maven <Optional> . Основные преимущества использования тега заключаются в том, что он может уменьшить размер проекта и помочь предотвратить конфликты версий. Мы также увидели, что тег не влияет на проект, в котором он используется.

Исходный код в этой статье доступен на Github.