«1. Обзор

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

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

2. Что такое \u003cнеобязательно\u003e?

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

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

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

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

3. Как использовать \u003cOptional\u003e

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

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

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

В этом примере, хотя optional-project помечен как необязательный, он остается пригодной для использования зависимостью проекта с необязательными опциями, как если бы тег \u003cOptional\u003e там никогда не было.

Чтобы увидеть эффект тега \u003cOptional\u003e, нам нужно создать новый проект, который зависит от проекта с дополнительными параметрами:

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

Теперь, если мы попытаемся сослаться на дополнительный проект из основного -project, мы видим, что необязательного-проекта не существует. Это связано с тем, что тег \u003cOptional\u003e предотвращает его транзитивное включение.

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

4. Заключение

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

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