этот вопрос немного широк, вещи могут немного измениться, когда вы начнете говорить о многомодульных проектах Maven (поэтому между модулями существуют отношения родитель-потомок). Я буду предполагать, что многомодульные установки не подходят для этого вопроса c.
Также: IDE тесно интегрированы с Maven и могут добавить дополнительные автоматизированные процессы c поверх него. Я предполагаю, что это простой Maven, так как он будет работать из оболочки.
наконец: есть большая разница от работы с зависимостями, которые вы извлекаете из inte rnet, и проектами, которые вы создаете сами с Maven. Я собираюсь ограничить этот ответ только созданием ваших собственных проектов, когда дело доходит до управления зависимостями. В противном случае я бы написал здесь руководство для Maven.
предположим, что у меня есть проект A, который зависит от B. Поэтому, когда я создаю проект A. Maven генерирует артефакт A, связывая его с артефакт проекта B?
Maven будет включать все, что вы добавляете в список зависимостей; если это невозможно, сборка не удастся. Если проект B является вашим собственным проектом, он не будет автоматически собирать B для вас, когда вы создаете проект A, он будет пытаться включить только тот jar, который уже есть в вашем локальном репозитории maven . Если в вашем локальном репозитории нет jar, он попытается загрузить его из всех репозиториев Maven, известных в рамках проекта. Это потерпит неудачу, если Project B - это просто проект, работающий на вашем жестком диске. Единственный способ сделать JAR-файл Project B доступным для использования в Project A - это сначала создать и установить Project B, чтобы поместить копию JAR-файла в Ваш локальный репозиторий Maven.
Аналогично, если проект B изменяется, но вы не изменяете его номер версии Maven, вы несете ответственность за его перестройку и установку, чтобы существующий jar в вашем локальном репозитории maven перезаписывался.
Возможно, что jar зависимостей B перенесен в удаленный репозиторий; может случиться так, что ваша компания, например, размещает или лицензирует Nexus или Artifactory, а сборки для разработки помещаются в репозиторий моментальных снимков, поэтому он может использоваться несколькими разработчиками на разных машинах без необходимости извлекать проект и создавать его самостоятельно. машина. Тогда это зависит от того, как настроен Maven, будет ли он охотно загружать обновленные версии jar при создании проекта A. Если вы работаете с удаленным репозиторием и подозреваете, что во время сборки используется более старая версия зависимого jar, этот существующий вопрос подробно описывает несколько способов принудительного обновления jar-файлов зависимостей, когда они уже были загружены ранее. Но вам вряд ли когда-нибудь понадобится это использовать.
и предположить, что проект B зависит от C. затем, когда я создаю проект A, он по умолчанию использует транзитивную зависимость c для генерации артефакта?
Да, он будет обходить все дерево зависимостей и включать все переходные зависимости.
и даже если это произойдет, что произойдет, если я добавлю C в качестве зависимости в проект A pom. xml? Будет ли maven дважды брать артефакт C для создания A и генерировать файл большего размера?
Ну, во-первых: зависимости не включены в jar проекта A по умолчанию, поэтому размер от банки не зависит от количества зависимостей проекта. Вы должны были бы специально использовать плагин, который имеет эту функциональность, часто называемую «один jarring», «создание толстой банки» или «uber jar». Плагин Maven Shade является обычным способом сделать это.
Независимо от этого, Maven не разрешает нескольким копиям одной и той же пары groupId зависимости / artifactId существовать на пути к классам и отфильтровывает дубликаты. копирует, когда находит их. Это также происходит, когда вы добавляете один и тот же артефакт несколько раз в одну и ту же помпу, Maven будет вызывать вас и включать только одну копию.
Так что нет, в конце концов будет только одна копия C .jar. Даже если пометка A относится к C версии 1.0, а помпа B относится к C версии 1.1.