Я пытаюсь настроить многомодульный проект Maven, и, по-видимому, межмодульные зависимости настроены неправильно.
Я имею:
<modules>
<module>commons</module>
<module>storage</module>
</modules>
в родительском POM (который имеет упаковку типа POM) , а затем подкаталоги commons/
и storage/
которые определяют JAR Poms с тем же именем.
Хранение зависит от Commons.
В основном (главном) каталоге я запускаю mvn dependency:tree
и вижу:
[INFO] Building system
[INFO] task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] domain:system:pom:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:3.8.1:test
[INFO] ------------------------------------------------------------------------
[INFO] Building commons
[INFO] task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
...correct tree...
[INFO] ------------------------------------------------------------------------
[INFO] Building storage
[INFO] task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
Downloading: http://my.repo/artifactory/repo/domain/commons/1.0-SNAPSHOT/commons-1.0-SNAPSHOT.jar
[INFO] Unable to find resource 'domain:commons:jar:1.0-SNAPSHOT' in repository my.repo (http://my.repo/artifactory/repo)
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.
Missing:
----------
1) domain:commons:jar:1.0-SNAPSHOT
Почему зависимость от "общего" не работает, хотя реактор, очевидно, видел это, потому что он успешно обрабатывает свое дерево зависимостей? Это определенно не должно идти в сеть, чтобы найти его, поскольку оно прямо там ...
Пом для хранения:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<parent>
<artifactId>system</artifactId>
<groupId>domain</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>domain</groupId>
<artifactId>storage</artifactId>
<name>storage</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- module dependencies -->
<dependency>
<groupId>domain</groupId>
<artifactId>commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- other dependencies -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Спасибо за любые предложения!
(Редактировать)
Чтобы уточнить, что я ищу вот что: я не хочу устанавливать модуль X для создания модуля Y, который зависит от X, учитывая, что оба являются модулями, на которые ссылается один и тот же родительский POM. Для меня интуитивно понятно, что если у меня есть две вещи в одном дереве исходных текстов, мне не нужно устанавливать промежуточные продукты для продолжения сборки. Надеюсь, мои мысли здесь имеют какой-то смысл ...
источник
Ответы:
Я думаю, проблема в том, что когда вы указываете зависимость, Maven ожидает, что она будет упакована как jar (или что-то еще) и будет доступна по крайней мере из локального репо. Я уверен, что если вы
mvn install
сначала запустите свой общий проект, все будет работать.источник
Как обсуждалось в этом потоке списка рассылки maven , цель dependency: tree сама по себе будет искать вещи в репозитории, а не в реакторе. Вы можете обойти это, установив mvn, как было предложено ранее, или выполнив что-то менее обременительное, вызывающее реактор, например
mvn compile dependency:tree
Работает на меня.
источник
compile
запускает загрузку транзитивных зависимостей. Есть ли также способ перечислить дерево зависимостей, не загружая их (за исключением, конечно, POM)?compile
(validate
недостаточно) помогло и там:mvn compile animal-sniffer:check
иmvn compile org.basepom.maven:duplicate-finder-maven-plugin:check
package
поэтапно, поэтому мне нужно было сделать, напримерmvn package animal-sniffer:check
.Понимая, что это более старая тема, но кажется, что либо инструмент эволюционировал, либо его могли упустить в первый раз.
Можно выполнить сборку, которая разрешает зависимости без установки, выполнив сборку реактора.
Если вы начнете сборку в родительском элементе, который описывает структуру модуля вашего проекта, то ваши зависимости между модулями будут разрешены во время сборки через внутренний реактор Maven.
Конечно, это не идеальное решение, поскольку оно не решает проблемы создания отдельного отдельного модуля в структуре. В этом случае у Maven не будет зависимостей в своем реакторе, и он будет искать решение в репозитории. Так что для отдельных сборок вам все равно нужно сначала установить зависимости.
Вот ссылка, описывающая эту ситуацию.
источник
mvn dependency:tree
, он все равно не разрешит зависимости от источников, если вы не вызоветеcompile
phase. Так что это будет работать вместо:mvn compile dependency:tree
.для меня то, что привело меня к этой теме, было аналогичной проблемой, и решение состояло в том, чтобы убедиться, что все зависимости модуля pom имеют
<packaging>pom</packaging>
у родителя был
пом
у моего модельного депа был помпон, поэтому баночки не было.
источник
Единственное, что у меня сработало: переход на gradle :(
я имею
Parent +---dep1 +---war1 (using dep1)
и я могу просто cd в war1 и использовать mvn tomcat7: run-war. Мне всегда приходилось устанавливать весь проект раньше, несмотря на то, что war1 ссылается на своего родителя, а родительский ссылается на war1 и dep1 (как модули), поэтому все зависимости должны быть известны.
Я не понимаю, в чем проблема.
источник
В такой структуре модуля Maven:
- parent - child1 - child2
У вас будет в
parent
pom
этом:<modules> <module>child1</module> <module>child2</module> </modules>
Если теперь вы зависите от
child1
inchild2
, вставив в свой<dependencies>
in следующееchild2
:<dependency> <groupId>example</groupId> <artifactId>child1</artifactId> </dependency>
Вы получите сообщение об ошибке JAR для
child1
не удается найти . Это можно решить, объявив<dependencyManagement>
блок, включив егоchild1
вpom
forparent
:<dependencyManagement> <dependencies> <dependency> <groupId>example</groupId> <artifactId>child1</artifactId> <version>${project.version}</version> </dependency> </dependencies> </dependencyManagement>
child1
теперь будет строиться, когда вы запускаете цельcompile
иpackage
т. д.parent
, иchild2
найдетchild1
скомпилированные файлы.источник
Бонус за ответ от Дона Уиллиса :
Если ваша сборка создает тестовые банки для совместного использования тестового кода между подмодулями вашего реактора, вы должны использовать:
mvn test-compile dependency:tree
что позволит
dependency:tree
в этом случае работать до завершения.источник
Убедитесь, что модуль, который не работает, разрешен в pom, указывает на правильного родителя, включив конфигурации в файл pom модуля.
источник