Может ли Родительский проект 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 проектирует как мой родитель с ним. наконец-то использовал моего родителя ссылки во всех моих дочерних модулях. Таким образом, я использую его как сочетание обеих моделей.