Наследование Maven и оценка свойств

Поскольку системная область считается устаревшей и опасной, мы используем локальный репозиторий. Репозиторий находится в родительской папке и используется большинством подмодулей. Теперь включение репо становится беспорядочным. Предоставление URL-адреса является своего рода хаком.

Мы пробовали ${project.parent.basedir}/repo в подмодулях, но это ничего не дает. Мы также пытались установить его в родительском pom,...

<repository>
  <id>project_repo</id>
  <url>file://${project.basedir}/project_repo</url>
</repository>

но maven решает отправить URL-адрес, указанный в подмодулях, которые, в свою очередь, оценивают свойство. Это привело нас к беспорядку, когда мы просто взяли относительный родительский каталог, заставив подмодули быть подпапками родительского pom:

<url>file://${project.basedir}/../project_repo</url>

Это проблема Y. Вопрос, касающийся X, заключается в том, почему maven наследует до оценки и как этого избежать?


person ManuelSchneid3r    schedule 06.06.2016    source источник
comment
Какова цель этого репозитория на основе файлов, который в целом является плохой идеей... либо используйте локальный кеш $HOME/.m2/repository, и хорошей идеей будет использовать менеджер репозитория...   -  person khmarbaise    schedule 06.06.2016
comment
Вы неправильно поняли цель файла project_repo. Это репо, эквивалентное центральному репозиторию maven, а не локальному кешу в .m2. Цель состоит в том, чтобы хранить сторонние JAR-файлы, которые вам нужны, но не существуют ни в одном общедоступном репозитории. Он заменяет (не рекомендуется) использование системной области.   -  person ManuelSchneid3r    schedule 06.06.2016
comment
Да я знаю, но это все равно не имеет смысла. Вы должны использовать менеджер репозитория и обрабатывать его там... чтобы избавиться от таких взломов...   -  person khmarbaise    schedule 06.06.2016
comment
Вам удалось это решить? У меня точно такая же проблема.   -  person lpacheco    schedule 17.02.2017


Ответы (1)


заставить подмодули быть подпапками родительского pom

Независимо от других возникающих проблем, на самом деле это рекомендуемый подход в целом, чтобы иметь проект с несколькими модулями/агрегацией (родительский) и подмодули в качестве подпапок, чтобы иметь одну центральную папку/точку входа (родительскую), предоставляющую общие конфигурация и управление (его pom.xml файл) и модули (подпапки).

но maven решает отправить URL-адрес, указанный в подмодулях, которые, в свою очередь, оценивают свойство.

Действительно, project.basedir оценивается как папка, содержащая pom.xml, по сравнению с тем, что мы сейчас создаем (или подпостройкой, в случае модуля), поскольку проект сборки является модулем в данный момент времени.
Из официальной документации относительно project.basedir

Каталог, в котором находится текущий проект.

Если вы хотите всегда указывать на папку, из которой вы запустили сборку (в данном случае это агрегатор/родительский проект), вы можете вместо этого использовать session.executionRootDirectory.

Однако будьте осторожны, особенно если вы хотите построить модуль непосредственно из его каталога, вы можете столкнуться с проблемами (проблемы с путями): вы всегда должны запускать его из родителя, используя параметры реактора, такие как -pl (проекты для сборки).

Это также повод для дальнейших размышлений: от такого подхода может пострадать обслуживание и читабельность проекта. Тогда лучшим решением будет корпоративный репозиторий Maven.


Дальнейшее чтение на SO:


Обновить

Вопрос, касающийся X, заключается в том, почему maven наследует до оценки и как этого избежать?

Что касается вашего вопроса X, вот объяснение, которое я смог найти:

Ответ зависит от ядра сборки Maven, Maven Model Builder. :

Эффективный построитель моделей с активацией профиля, наследованием, интерполяцией, ...

В частности, он выполняет следующие шаги в следующем порядке:

  • phase 1
    • profile activation
    • проверка необработанной модели
    • нормализация модели
    • профильная инъекция
    • родительское разрешение до супер-пом
    • сборка наследования
    • интерполяция модели
    • нормализация URL

Смелый мой. То есть он делает это, потому что он создан для этого своей моделью.

person A_Di-Matteo    schedule 06.06.2016