Какая версия maven поддерживает исключение из управления зависимостями - PullRequest
0 голосов
/ 09 ноября 2018

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

<dependency>
<groupId>..</groupId>
<artifactId>...</artifactId>
<version>...</version>
<type>pom</type>
<scope>import</scope>
<exclusions>
    <exclusion>
        <groupId>...</groupId>
        <artifactId>...</artifactId>
    </exclusion>
</exclusions>
</dependency>

Может ли кто-нибудь дать мне знать, возможно ли исключить зависимость. Я использую 3.5.2 maven версию.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Исключения были доступны в Maven долгое время, это не проблема.Оставьте текущую версию Maven, она хорошо справится со своей работой.

Я думаю, что здесь есть путаница.Из отрывка pom, который вы написали выше, мы видим, что вы импортируете pom (область действия «импорт»), которая часто называется спецификацией (для спецификации).

Спецификация импортируется в <dependencyManagement>раздел (не показан выше), и его цель может быть суммирована следующим образом: «Я определяю много разных библиотек, включая их версии, так что если вы импортируете меня, вы можете пропустить, чтобы указать версию библиотек, которые вы определяете, но вам все равно придется явноопределить ваши прямые зависимости ".

Под этим я подразумеваю, что спецификация не" заставляет "вас использовать библиотеки, которые она определяет: она только намекает на то, что в случае, если вы или ваши зависимости зависят от конкретной библиотекиZ, тогда версия Z будет принудительно установлена ​​на версию, определенную в спецификации ".

Таким образом, спецификация не" навязывает "зависимости от вас, поэтому вы не можете" исключить "любую зависимость, когда эта спецификацияопределен. Вы должны точно определить, где зависимость Z, которую вы хотите исключить, определены в вашем собственном проекте, и удалить ее там.также будет считаться транзитивной зависимостью, в этом случае вы должны исключить ее из зависимости, которую вы указали, используя теги <exclusions> / <exclusion> и groupId / artifactId.

В заключение: измените свой подход, вы не ищете в нужном месте.А также используйте плагин зависимостей Maven, который является вашим лучшим другом, чтобы понять, откуда возникла ваша нежелательная зависимость (mvn dependency:tree).

Надеюсь, это поможет

PS: вы не сказали, но делаетеу вас есть многомодульный проект?

0 голосов
/ 11 ноября 2018

Похоже, что эта версия еще не выпущена, но есть обходной путь.

Существует пример импорта зависимостей на Импорт зависимостей со следующим объяснением:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>maven</groupId>
    <artifactId>Z</artifactId>
    <packaging>pom</packaging>
    <name>Z</name>
    <version>1.0</version>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>maven</groupId>
                <artifactId>X</artifactId>
                <version>1.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>maven</groupId>
                <artifactId>Y</artifactId>
                <version>1.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

В приведенном выше примере Z импортирует управляемые зависимости как из X, так и из Y. Однако и X, и Y содержат зависимость a. Здесь будет использоваться версия 1.1 для a, так как X объявлен первым, а a не объявлен в Z зависимостьюManagement.

Учитывая это описание, вы сможете переопределить версию и / или область нарушающей зависимости, если вы ее определите ДО импорт.

Следуя тому же примеру, приведенное ниже определение должно использовать версию 2.0 a:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>maven</groupId>
    <artifactId>Z</artifactId>
    <packaging>pom</packaging>
    <name>Z</name>
    <version>1.0</version>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>test</groupId>
                <artifactId>a</artifactId>
                <version>2.0</version>
            </dependency>
            <dependency>
                <groupId>maven</groupId>
                <artifactId>X</artifactId>
                <version>1.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>maven</groupId>
                <artifactId>Y</artifactId>
                <version>1.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

Обязательно проверьте действующий пом!

...