Может ли Родительский проект maven включать модуль на том же уровне каталога

Я работаю в установленной кодовой базе с существующим автономным pom.XML.

намерение состоит в том, чтобы включить Дочерний проект под названием "hive"в подкаталог вне родительского. Примечание: улей / pom.xml уже существует, и он отлично работает сам по себе.

так в Родительском пом.xml я добавил:

   <modules>
      <module>hive</module>
   </modules>

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

 stephenb@gondolin:/shared/git2/etl$ mvn package assembly:single
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error building POM (may not be this project's POM).


Project ID: com.myco.etl:etl
POM Location: /shared/git2/etl/pom.xml
Validation Messages:

    [0]  Packaging 'jar' is invalid. Aggregator projects require 'pom' as packaging.


Reason: Failed to validate POM for project com.myco.etl:etl at /shared/git2/etl/pom.xml


[INFO] ------------------------------------------------------------------------
[INFO] Trace
org.apache.maven.reactor.MavenExecutionException: Failed to validate POM for project com.myco.etl:etl at /shared/git2/etl/pom.xml
    at org.apache.maven.DefaultMaven.getProjects(DefaultMaven.java:404)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:272)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
    at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

кажется, что maven хочет, чтобы я создал Родительский pom, который в основном ничего не делает, кроме определения модулей зависимостей.

Ну, я могу создать новый pom.XML. Но то, что я не могу сделать, это переместить существующие файлы проекта в новый подкаталог.

есть ли способ обойти это? Е. Г. определение подмодуль, который живет на том же уровне (не каталогом)? Или какой-то другой способ работы с существующей структурой dir?

спасибо

Follow-up: на основе ввода, что a модуль может быть просто файлом в локальном dir, I создал еще один pom, который вызывает исходный. Оригинал был переименован в pommod.xml и новый, показанный ниже, называется pom.XML.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.myco.etl</groupId>
    <artifactId>etl</artifactId>
    <name> ETL Helpers</name>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>
        <modules>
  <module>appminer</module>
  <module>pommod.xml</module>
   </modules>

Я запустил "mvn compile package", но все равно получил ту же ошибку:

Project ID: com.myco:app_miner
POM Location: /shared/git2/etl/mycopom.xml
Validation Messages:

[0]  Packaging 'jar' is invalid. Aggregator projects require 'pom' as packaging.


Reason: Failed to validate POM for project com.myco:app_miner at /shared/git2/etl/myco/pom.xml

3 ответов


чтобы ответить на вопрос в названии этого поста:

да, Maven может включать Родительский и модуль на том же уровне каталога. Я чувствую, что сначала должен объяснить, что у родителя могут быть дети и модули. Дети и модули-это не одно и то же:

  • дочерние отношения определяются через parent в детском пом. Если ваш родитель находится в РЕПО, это все. Если ваш родитель находится в файловой системе, вы должны играть с parent.relativePath для его нахождения в та же папка
  • модуль определяется через modules в Родительском пом. Модуль обычно содержит имя папки, а файл POM подразумевается (например,<module>mod</module> эквивалентно <module>mod/pom.xml</module>). Следовательно, модуль в той же папке будет <module>pom1.xml</module> или что-то в этом роде. (Я назвал POM-файл модуля pom1.xml в этом примере, предполагая, что pom.xml уже занято родителем-посмотрите, в какой беспорядок мы попадаем)

позвольте мне быстро привести пример, где дети и модули совершенно разные: у вас могут быть POMs для создания приложения каждой из ваших команд. Каждая из вашей команды может иметь webapps и backend приложения. У вас могут быть родительские помпоны для webapps и бэкэнд-приложений. Таким образом, некоторое бэкэнд-приложение будет дочерним POM для бэкэнд-приложений, будучи модулем команды, которая работает над ним.


меня поражает то, что вы говорите об упаковке. Родительский POM (упаковка pom) обычно является просто blob метаданных и больше ничего. Если вы хотите, чтобы это было что-то еще, вы все равно можете прикрепить выполнение плагинов к фазам жизненного цикла. Вы даже можете запустить Плагины упаковки и прикрепить результаты к артефакту.


я не понимаю, почему hive не может быть дочерним (собственная папка, собственный POM в этой папке), красиво на один уровень ниже от родителя, как Maven имел в виду это. Но мне показалось, что у вас может быть какой-то проект, в любом другом каталоге, зависящий от jar артефакт в hive, и превратите его в любую сборку, которую вы хотите. Так что hive будет зависимостью от проекта сборки (скажем hive-assembly). Я перехожу к следующему пункту...


тот факт, что Maven фактически позволяет вам иметь родителя и ребенка в одной папке, вовсе не является хорошим аргументом для этого. Это только вопрос времени для какой-то части Maven или одного из его плагинов будет работать против вас. Maven is"соглашение по конфигурации", live на что!


эта проблема может быть решена с помощью Maven это Проект Агрегации вместо Проект Наследования.


пожалуйста, обратитесь к простым примерам, приведенным на сайте maven: http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Inheritance_vs_Project_Aggregation

что четко объясняет, Когда вы хотите иметь отношения родитель-ребенок или отношения пакет-модули или отношения родитель-модули (сочетание обоих).

пример с проектами Spring Boot:

Я использую всю свою Sprint boot проекты с проектом spring boot starter как родитель, вот у меня отношения родитель-ребенок.

для упаковки у меня есть отдельный файл pom в корневом каталоге( или относительный путь), который определяет все модули в нем. Но нет ссылка на мой родительский проект в моих модулях. поэтому здесь я использую его как отношение пакет-модуль.

но недавно изменил мою конфигурацию, чтобы использовать отношения родитель-модули, создал Родительский файл pom и упоминается spring boot starter проектирует как мой родитель с ним. наконец-то использовал моего родителя ссылки во всех моих дочерних модулях. Таким образом, я использую его как сочетание обеих моделей.