Существует ли какой-либо способ избежать дублирования JAR-файлов с отличным groupId в maven без исключения дубликатов? - PullRequest
2 голосов
/ 23 декабря 2010

У меня есть сборка maven, которая генерирует несколько дублированных JAR-файлов в classpath.

Вот несколько примеров:

groupId: javax.xml.stream
artifactId: stax
version: 1.0-2

groupId: stax
artifactId: stax
version: 1.0.1

groupId: jboss
artifactId: javassist
version: 3.7.0 GA

groupId: javassist
artifactId: javassist
version: 3.9.0 GA

Эти JAR-файлы не импортируются напрямую из моего проекта, они являются переходными зависимостями. Поскольку groupId и artifactId разных версий не совпадают, maven считает, что они независимы.

Я могу выследить (возможно, использую какой-то инструмент для этого) эти дубликаты и явно исключить их в pom.xml. Однако я не хочу вручную выслеживать их и исключать, потому что это побеждает автоматическое управление зависимостями из maven и является кошмаром, когда обновляется некоторая зависимость и транзистивные зависимости снова не совпадают. Есть ли способ сделать умнее maven и исправить это автоматически?

Ответы [ 2 ]

1 голос
/ 14 мая 2011

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

0 голосов
/ 13 декабря 2015

Существует обходной путь, использующий механизм relocation , хотя он может работать только в определенных средах.

Вкратце relocation позволяет вам «перенаправить» все зависимостинапример, от javax.xml.stream:stax до stax:stax.Проблема в том, что добавить перемещение - это не то, что вы можете сделать в своем собственном проекте.Вы должны добавить новую версию к исходным groupId и artifactId, содержащую информацию о перемещении.Если у вас есть частный (например, корпоративный) репозиторий Maven, вы можете добавить его туда или, если разработчиков немного, можно использовать локальный репозиторий разработчиков.В других случаях вам, вероятно, не повезло с этим решением.


Теперь подробности:

Создайте новый проект Maven с 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>

    <!-- Coordinates of the artifact you want to replace -->
    <groupId>javax.xml.stream</groupId>
    <artifactId>stax</artifactId>
    <!-- Some dummy version that would never be released -->
    <version>relocate-to-stax</version>

    <distributionManagement>
        <relocation>
            <!-- Coordinates of the new artifact -->
            <groupId>stax</groupId>
            <!-- artifactId stays the same → no need to specify again -->
        </relocation>
    </distributionManagement>
</project>

Добавьте это в свой репозиторий (например, используя mvn install).

В вашем проекте добавьте эту новую версию для артефакта в раздел dependencyManagement:

<project>
    <!-- ... -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>javax.xml.stream</groupId>
                <artifactId>stax</artifactId>
                <version>relocate-to-stax</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

Спри этом все зависимости javax.xml.stream:stax будут использовать "версию" relocate-to-stax, которая будет перемещена в stax:stax:relocate-to-stax.Осталось только добавить нужную версию целевого артефакта в dependencyManagement:

<project>
    <!-- ... -->
    <dependencyManagement>
        <dependencies>
            <!-- ... -->
            <dependency>
                <groupId>stax</groupId>
                <artifactId>stax</artifactId>
                <version>1.0.1</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...