Как работает исключение зависимостей maven для этих сценариев

Мне сложно понять управление зависимостями maven и то, как работает исключение зависимостей. Я знаю, что когда какой-то объект класса A отправляет сообщения (вызывает метод) другому объекту другого класса B, тогда класс A соединяется с классом B (класс A требует, чтобы класс B существовал).

Я использую Maven в проекте и имею эту зависимость в pom:

      <dependencies>
    <dependency>
        <groupId>org.libraries</groupId>
        <artifactId>library-A</artifactId>
    </dependency>
</dependencies>

Предположим, что это от, и это зависит от class Bin, но я не использую в своем проекте (я использую другой класс, не связанный ни с каким классом). Maven загрузит и установит в локальном репозитории зависимость, даже если она не используется в моем проекте?

Теперь, предполагая другой сценарий, который я использую в своем проекте, который зависит от of, но я исключаю зависимость от в pom:

      <dependencies>
    <dependency>
        <groupId>org.libraries</groupId>
        <artifactId>library-A</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.libraries</groupId>
                <artifactId>library-B</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

Поскольку у меня нет другой зависимости в pom, которая зависит от того, будет ли проект компилироваться, но выполнение программы не выполняется во время загрузки класса, потому что класс не найден?

Предполагая, что я буду использовать from в своем проекте, который зависит от class-B из library B, но я исключаю зависимость в pom, хотя у меня есть зависимость, которая зависит (например) от:

      <dependencies>
    <dependency>
        <groupId>org.libraries</groupId>
        <artifactId>library-A</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.libraries</groupId>
                <artifactId>library-B</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.libraries</groupId>
        <artifactId>library-C</artifactId>
    </dependency>
</dependencies>

Теперь, хотя я исключаю транзитивную зависимость, ** будет ли проект компилироваться и выполняться нормально, а class A in будет использовать, потому что транзитивная зависимость library-C есть (при условии, что эта версия совместима с)?

Последний вопрос: когда я исключаю зависимость и использую dependency:tree -Dverbose чтобы увидеть график зависимостей, он не будет отображаться на графике. library-Bзависимость, хотя на самом деле он мог бы использовать эту зависимость, которая возникает транзитивно, потому что другая зависимость. Я ошибаюсь? Если я не ошибаюсь, откуда мне это знать? library-A действительно использует эту зависимость или нет?

1 ответ

Позвольте мне попытаться ответить на ваши вопросы в более общем плане:

  1. Maven не будет анализировать, какие классы вы используете (или не используете). Он просто определяет дерево транзитивных зависимостей.

  2. В конце концов, Maven создает путь к классам. Путь к классам плоский, и не имеет значения, с какой стороны возникла данная зависимость.

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

Другие вопросы по тегам