Артефакты из зависимостей можно исключить, объявив <exclusions>
элемент внутри. <dependency>
Но в этом случае необходимо исключить артефакт, унаследованный от родительского проекта. Ниже приводится отрывок из обсуждаемой POM:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>jruby</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<artifactId>base</artifactId>
<groupId>es.uniovi.innova</groupId>
<version>1.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>ALL-DEPS</artifactId>
<version>1.0</version>
<scope>provided</scope>
<type>pom</type>
</dependency>
</dependencies>
</project>
base
артефакт, зависит javax.mail:mail-1.4.jar
и ALL-DEPS
зависит от другой версии той же библиотеки. Из-за того, что mail.jar
from ALL-DEPS
существует в среде выполнения, хотя и не экспортируется, конфликтует с mail.jar
существующим в родительской среде , которая имеет область видимости compile
.
Решением может быть избавление mail.jar от родительского POM, но большинству проектов, наследующих базу, он нужен (как и переходная зависимость для log4j). Поэтому я хотел бы просто исключить родительскую библиотеку из дочернего проекта , как это можно было бы сделать, если бы base
была зависимость, а не родительский pom:
...
<dependency>
<artifactId>base</artifactId>
<groupId>es.uniovi.innova</groupId>
<version>1.0.0</version>
<type>pom<type>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
</exclusions>
</dependency>
...
Вы можете сгруппировать свои зависимости в другом проекте с помощью упаковки,
pom
как описано в Sonatypes Best Practices :и ссылайтесь на них из родительского pom (смотрите зависимость
<type>pom</type>
):Ваш дочерний проект наследует этот родительский объект, как и раньше. Но теперь почтовую зависимость можно исключить в дочернем проекте внутри
dependencyManagement
блока:источник
Не используйте родительский помпон
Это может показаться чрезмерным, но так же, как «ад наследования» - это причина, по которой некоторые люди отворачиваются от объектно-ориентированного программирования (или предпочитают композицию наследованию ), удаляют проблемный
<parent>
блок и копируют и вставляют все, что<dependencies>
вам нужно (если ваша команда дает вам эта свобода).Предположение, что разделение помпонов на родительский и дочерний для «повторного использования» и «предотвращения повторения» следует игнорировать, и вы должны в первую очередь удовлетворить свои непосредственные потребности (лекарство хуже, чем болезнь). Кроме того, у резервирования есть свои преимущества, а именно независимость от внешних изменений (т.е. стабильность).
Это проще, чем кажется, если вы создаете эффективный pom (eclipse предоставляет его, но вы можете сгенерировать его из командной строки с помощью
mvn help:effective
).пример
Я хочу использовать в
logback
качестве привязки slf4j, но мой родительский pom включаетlog4j
зависимость. Я не хочу уходить и вынуждать других детей использовать log4j в их собственныхpom.xml
файлах, чтобы не мешать моим.источник
Переопределите зависимость (в дочернем pom),
scope
указав system на пустую банку:Банка может содержать только один пустой файл:
источник
notepad empty.class
затемjar cvf empty.jar empty.class
генерировать пустую банку.Вы пытались явно указать версию mail.jar, которую хотите? Разрешение зависимостей Maven должно использовать это для разрешения зависимостей во всех других версиях.
источник
Лучше всего сделать зависимости, которые вы не всегда хотите наследовать, непереходными.
Вы можете сделать это, отметив их в родительском pom с предоставленной областью.
Если вы по-прежнему хотите, чтобы родительский элемент управлял версиями этих зависимостей, вы можете использовать
<dependencyManagement>
тег для настройки версий, которые вам нужны, без их явного наследования или передачи этого наследования дочерним элементам .источник
Когда вы вызываете пакет, но не хотите использовать некоторые из его зависимостей, вы можете сделать что-то вроде этого (в этом случае я не хотел добавлять старый log4j, потому что мне нужно было использовать более новый):
Это работает для меня ... но я новичок в java / maven, поэтому, возможно, это не оптимально.
источник
Мне действительно нужно было сделать эту грязную вещь ... Вот как
Я переопределил эти зависимости с помощью области видимости
test
. Сфераprovided
у меня не сработала.Мы используем плагин Spring Boot для создания толстой банки. У нас есть модуль common, который определяет общие библиотеки, например Springfox swagger-2. У моего суперсервиса должен быть общий родительский элемент (он не хочет этого делать, но правила компании действуют!)
Итак, у моего родителя или в общем есть пом.
И мой суперсервисный пом.
Это размер последнего толстого артефакта.
Также стоит упомянуть этот ответ - я хотел это сделать, но я ленив ... https://stackoverflow.com/a/48103554/4587961
источник
Мы можем добавить родительский pom в качестве зависимости от типа pom и исключить его. Потому что в любом случае скачивается родительский пом. Это сработало для меня
источник