Maven: Как удалить зависимости, если они уже являются транзитивными?

например, если есть зависимости:

a -> b
a -> c
b -> c

Я хочу удалить зависимость a -> c, потому что там a -> b -> c.

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

пример:

In a.pom: 
<dependencies>
    <dependency>b</dependency>
    <dependency>c</dependency>
</dependencies>

In b.pom:
<dependencies>
    <dependency>c</dependency>
</dependencies>

ожидаемый результат:

In a.pom: 
<dependencies>
    <dependency>b</dependency>
</dependencies>

3 ответов


Я предполагаю, что вы хотите найти ложные/ненужные зависимости, которые уже выполнены, потому что вы получаете их бесплатно от другой зависимости.

Я могу себе представить, что вы, возможно, захотите сделать это, чтобы очистить свои помпоны.

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

вы никогда не знаете, если в будущем модуле b выводит c как зависимость и так ломается a


использовать mvn dependency:analyze чтобы показать вам, есть ли зависимости в вашем pom, которые вам не нужны (он также может определить некоторые, которые вы пропустили, добавьте -DoutputXML=true чтобы показать недостающие записи).

использовать mvn dependency:tree чтобы показать вам зависимости, используемые в настоящее время вашим проектом, и где Maven находит их. Добавить -Dverbose=true показать все дубликаты и конфликтов.

если a напрямую зависит от c (то есть если в коде a упоминает классов в c), тогда pom должен отражать его. Если a зависит только от b, тогда вы можете безопасно удалить c зависимость от aС пом.XML-файл. Приведенные выше команды должны позволить вам определить, какое следующее действие является подходящим.

Edit: ладно, вы обновили свой вопрос. Вот как вы это делаете:

  1. в проекте a , используя mvn dependency:tree -Dverbose=true. Это покажет вам полное дерево зависимостей, рассмотренных Maven для вашего проекта.
  2. посмотрите на вывод шага 1 и составьте список всех зависимостей, которые отображаются на более чем одном уровне (некоторые из них, вероятно, будут дубликатами).
  3. редактировать pom.xml-файл в любом редакторе и удалите все зависимости, соответствующие списку, созданному на Шаге 2.

или вы ищете способ сделать это автоматически? Я не думаю, что есть какой-либо автоматический способ, если вы не напишете его сами, потому что что вы пытаетесь сделать-это ПЛОХАЯ ИДЕЯ. Вы говорите людям, что их возражения "не имеют отношения" к вашему вопросу, но факт в том, что ваш вопрос похож на вопрос: "Как я могу использовать Maven, чтобы сделать его более сложным для использования Maven?"

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


Как и другие плакаты, Я не знаю, чего вы хотите достичь. Может быть, исключения-это то, что вам нужно? Вы можете использовать исключения для удаления зависимостей ваших зависимостей - если они не нужны по некоторым причинам.

        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>logkit</groupId>
                    <artifactId>logkit</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>avalon-framework</groupId>
                    <artifactId>avalon-framework</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>