Maven не розпізнає модулі братів або сестер під час запуску залежності mvn: дерево


90

Я намагаюся створити багатомодульний проект 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. Для мене це інтуїтивно зрозуміло, що якщо у мене є дві речі в одному дереві джерел, мені не потрібно встановлювати проміжні продукти, щоб продовжувати збірку. Сподіваюся, моє мислення має тут якийсь сенс ...


2
Аааа, редагування ідеальне. Чому ви не написали цього з першого наміру? Крім того, можливо, подумайте про зміну заголовка :) Я не хочу бути прискіпливим, це просто заради ясності та класифікації. Це допоможе всій спільноті в майбутньому при пошуку подібної проблеми (що не є абсолютно зрозумілим із фактичним заголовком та вмістом, що стосується залежності: дерево)
Паскаль Тівент

1
Привіт. Ви знайшли рішення? Я теж маю цю проблему :(

1
Чи не вдається компіляція, чи просто залежність: лише мета дерева? Дивіться відповідь Дона Вілліса.
metamatt 02.03.11

OMG, тому в одному модулі, якщо він не вдається, оскільки він не може знайти символи іншого модуля, інший слід додати як залежність і встановити як JAR? Це ключ ....
WesternGun

це сумно maven 3.6 ще не вирішує цю проблему
yuxh

Відповіді:


21

Я думаю, проблема полягає в тому, що коли ви вказуєте залежність, Maven розраховує мати її як jar (або що завгодно), упаковану та доступну принаймні з локального репо. Я впевнений, що якщо ви запустите mvn installсвій спільний проект, спочатку все запрацює.


4
Чи є спосіб вказати, що я хочу, щоб він використовував будь-яку версію модуля в дереві джерела? Я думав, що ця справа буде розглянута автоматично. Я не хочу / не думаю, що Maven вимагає будувати-встановлювати-будувати-встановлювати-будувати кожного разу, коли я просто хочу зробити весь проект!
Стівен Шланскер

38
Ви праві, що запуск інсталяції це виправляє. Однак зараз мені доводиться встановлювати кожен раз, коли я вношу зміни, а це не те, що я хочу. Я хочу, щоб проект сховища забрав останній код із спільного проекту.
Стівен Шланскер

Насправді мені доводиться мати справу з подібними проблемами, і на жаль - поки що я не можу знайти відповіді. Схоже, Maven не хвилює, що залежність пов'язана з вашим модулем, він просто відразу переходить до репо. Я поставлю улюблене на ваше запитання - так, можливо, якийсь гуру відповість. Мені цікаво дізнатись, чи можна це зробити
Бостон

@Steven Будь ласка, опублікуйте свою стурбованість як ще одне запитання, відповісти у коментарі не зручно, і це інша тема.
Паскаль Тивент

6
Це мало бути головним питанням, я просто уточнював. Хіба я в оригінальному питанні не дав зрозуміти, що я маю намір не вимагати, щоб побудовані продукти знаходились у локальному сховищі для побудови інших модулів у тому самому проекті?
Стівен Шланскер,

104

Як обговорювалось у цьому потоці списку розсилки maven , мета залежності: дерево сама по собі буде шукати речі у сховищі, а не в реакторі. Ви можете обійти це, встановивши mvn, як було запропоновано раніше, або зробивши щось менш обтяжливе, що викликає реактор, наприклад

mvn compile dependency:tree

Працює для мене.


2
Дякую за цей дешевий обхідний шлях. Але чи це помилка? Я очікую залежності: мета дерева покладається на реактор без жодних хитрощів.
mcoolive

Слід зазначити, що та сама ситуація трапляється з будь-яким завданням, яке виконується глобально, але впливає лише на деякі підпроекти.
tkruse

На жаль, compileініціює завантаження транзитивних залежностей. Чи існує також спосіб перерахувати дерево залежностей без їх фактичного завантаження (крім POM, звичайно)?
sschuberth

У мене була та сама проблема для інших цілей. Додавання compile( validateмало) допомогли там: mvn compile animal-sniffer:checkіmvn compile org.basepom.maven:duplicate-finder-maven-plugin:check
MSA

Залежно від вашої збірки, деякі модулі можуть також мати залежності від артефактів, які будуються на наступних етапах. У моєму випадку ZIP-файл (з використанням плагіна maven-Assembly) був побудований по packageфазі, тому мені потрібно було зробити, наприклад mvn package animal-sniffer:check.
msa

6

Розуміючи, що це старіший потік, але, схоже, або інструмент еволюціонував, або це можливо було пропущено вперше.

Можна виконати побудову, яка робить залежності вирішеними без встановлення, виконуючи побудову реактора.

Якщо ви починаєте свою збірку в батьківському, що описує структуру модулів вашого проекту, ваші залежності між вашими модулями будуть вирішені під час самої збірки за допомогою внутрішнього реактора Maven.

Звичайно, це не ідеальне рішення, оскільки воно не вирішує побудову окремого окремого модуля в структурі. У цьому випадку Мейвен не матиме залежностей у своєму реакторі і буде прагнути вирішити це питання у сховищі. Отже, для окремих збірок вам все одно доведеться спочатку встановлювати залежності.

Ось кілька посилань, що описують цю ситуацію.


1
Чи є спосіб побудови єдиного модуля без попереднього встановлення залежностей і без побудови повного батьківського проекту?
Вийшов - Аноні-Мус

1
Щоб завершити відповідь - якщо плагін викликається безпосередньо (без фаз), наприклад mvn dependency:tree, він все одно не вирішить залежності від джерел, якщо ви не викликаєте compileфазу. Так що це буде працювати замість: mvn compile dependency:tree.
Станіслав Башкирцев

3

для мене те, що привело мене до цього потоку, було подібною проблемою, і рішенням було забезпечити всі залежності модулів pom

 <packaging>pom</packaging>

батько мав

пом

у моєї моделі деп був пом - тому жодної банки не було знайдено.


Це видає для мене цю помилку: Розбір помилки при читанні POM. Причина: Нерозпізнаний тег: 'упаковка'
hithwen

редагувати: я мав на увазі <packaging> pom </packaging> виправити це. заміна <packaging> jar </packaging>
bsautner

4
Це виправляє проблему, описану у питанні, але тепер дочірні модулі не створюють експортовані архіви (тобто банки, війни, вуха).
sheldonh

sheldonh ви знайшли рішення для виправлення цієї помилки та створили експортний архів?
user3853134

3

Єдине, що мені вдалося: перехід на gradle :(

У мене є

Parent
  +---dep1
  +---war1 (using dep1)

і я можу просто cd у war1 і використовувати mvn tomcat7: run-war. Мені завжди доводиться встановлювати весь проект раніше, незважаючи на посилання war1 на його батька та батьківські посилання war1 та dep1 (як модулі), тому всі залежності повинні бути відомі.

Я не розумію, в чому проблема.


1
Ось чому я використовую gradle, коли мені доводиться створювати багатомодульний проект. :(
Чжо ІН,

2

У такій структурі модуля Maven:

- parent
  - child1
  - child2

У вас буде в parent pomцьому:

<modules>
  <module>child1</module>
  <module>child2</module>
</modules>

Якщо ви тепер залежате від child1in child2, вкладаючи в ваш <dependencies>in child2:

<dependency>
  <groupId>example</groupId>
  <artifactId>child1</artifactId>
</dependency>

Ви отримаєте повідомлення про помилку, для якого child1неможливо знайти JAR . Це можна вирішити, оголосивши <dependencyManagement>блок, що включає child1в pomдля parent:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>example</groupId>
      <artifactId>child1</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

child1тепер буде будуватися, коли ви запускаєте ціль compileабо packageін. parent, і child2знайде child1скомпільовані файли.


2

Bonusing від відповіді від Дона Вілліса :

Якщо ваша збірка створює тестові банки для обміну тестовим кодом між вашими підмодулями реактора, вам слід використовувати:

mvn test-compile dependency:tree

що дозволить dependency:treeу цьому випадку працювати до кінця.


-1

Переконайтеся, що модуль, який не працює, вирішується в pom, вказує на правий батько, включаючи конфігурації у файл pom модуля.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.