У меня есть проект с несколькими модулями, например этот:
main-project/
module1/
module2/
sub-module1/
sub-module2/
sub-module3/
...
module3/
module4/
...
Мне нужно определить набор свойств (которые зависят от среды, в которой я хочу выпустить свой проект) в Maven2. Не буду использовать, так <properties>
как свойств много ... Поэтому я использую плагин Properties Maven2 .
Файлы свойств находятся в main-project/
каталоге. Как я могу установить правильный каталог в основном pom.xml, чтобы указать детям, где найти файл свойств?
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-1</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>???/env_${env}.properties</file>
</files>
</configuration>
</execution>
</executions>
</plugin>
Если я установил только <file>env_${env}.properties</file>
, то когда Maven2 компилирует первый модуль, он не найдет main-project/env_dev.properties
файл. Если я установлю <file>../env_${env}.properties</file>
, то на родительском уровне или на любом уровне подмодуля возникнет ошибка ...
maven-2
properties
Ромен Линсолас
источник
источник
${maven.multiModuleProjectDirectory}
Ответы:
Попробуйте установить свойство в каждом pom, чтобы найти главный каталог проекта.
В родительском:
У детей:
У внуков:
источник
${parent.basedir}
больше ничего не разбирает в 3.0.4 ...${project.basedir}/..
но это действительно работает только в многомодульных проектах, которые находятся в строгой иерархии каталогов.file.separator
переменную<main.basedir>${project.basedir}${file.separator}..</main.basedir>
По крайней мере, в текущей версии maven (3.6.0) вы можете использовать
${maven.multiModuleProjectDirectory}
источник
Используйте directory-maven-plugin с directory-of target .
В отличие от других предложений:
Плагин позволяет вам установить свойство по вашему выбору для абсолютного пути любого из модулей проекта. В моем случае я установил его в корневой модуль ... В моем проекте root pom:
С этого момента $ {myproject.basedir} в любом подмодуле pom всегда имеет путь к корневому модулю проекта. И, конечно же, вы можете установить свойство для любого модуля, а не только для корня ...
источник
Я нашел решение своей проблемы: я ищу файлы свойств с помощью плагина Groovy Maven.
Поскольку мой файл свойств обязательно находится в текущем каталоге, в ../ или .. / .., я написал небольшой Groovy-код, который проверяет эти три папки.
Вот выдержка из моего pom.xml:
Это работает, но мне это не очень нравится.
Итак, если у вас есть лучшее решение, не стесняйтесь писать!
источник
Итак, проблема, как я вижу, в том, что вы не можете получить абсолютный путь к родительскому каталогу в maven.
<rant> Я слышал, что об этом говорят как об анти-шаблоне , но для каждого анти-шаблона есть реальный, законный вариант его использования, и мне надоело, что maven говорит мне, что я могу только следовать их шаблонам. </ разглагольствовать>
Итак, я нашел работу по использованию antrun. Попробуйте это в дочернем файле pom.xml:
Если вы запустите,
mvn verify
вы должны увидеть что-то вроде этого:Затем вы можете использовать
${main.basedir}
любой из других плагинов и т. Д. Мне потребовалось время, чтобы разобраться в этом, так что надеюсь, что это поможет кому-то другому.источник
Другая альтернатива:
в родительском помпе используйте:
В детских poms вы можете ссылаться на эту переменную.
Главное предостережение: он заставляет вас всегда выполнять команду из основного родительского каталога pom. Затем, если вы хотите запускать команды (например, тест) только для определенного модуля, используйте этот синтаксис:
mvn test --projects
Конфигурация верной настройки для параметризации переменной "path_to_test_data" может быть следующей:
источник
Следующий небольшой профиль работал у меня. Мне нужна была такая конфигурация для CheckStyle, которую я поместил в
config
каталог в корне проекта, чтобы я мог запускать ее из основного модуля и из подмодулей.Это не будет работать для вложенных модулей, но я уверен, что его можно изменить для этого, используя несколько профилей с разными
exists
. (Я понятия не имею, почему должно быть «../ ..» в теге проверки и просто «..» в самом переопределенном свойстве, но это работает только таким образом.)источник
В моем случае это работает так:
источник
Я нашел решение этой проблемы: используйте $ {parent.relativePath}
источник
Вы находитесь в проекте C, проект C - подмодуль B, а B - подмодуль A. Вы пытаетесь получить доступ к
src/test/config/etc
каталогу модуля D из проекта C. D также является подмодулем A. Следующее выражение позволяет получить путь URI:источник
источник
В ответ на другой вопрос я показал, как можно расширить maven-properties-plugin для использования внешних дескрипторов свойств, определенных в зависимостях Maven.
Вы можете расширить эту идею, добавив несколько файлов-файлов дескрипторов, каждая из которых содержит имя среды как часть artifactId, содержащую $ {env} .properties. Затем вы можете использовать свойство, чтобы выбрать соответствующий файл jar и свойств, например:
источник
Я просто улучшаю Groovy-скрипт сверху, чтобы записать свойство в корневой родительский файл свойств:
источник
Я думаю, что если вы используете шаблон расширения, использованный в примере для плагина и многомодуля findbugs, вы можете установить глобальные свойства, связанные с абсолютными путями. Используется верх
пример для многомодульного
У pom верхнего уровня есть несвязанный проект конфигурации сборки и родительское приложение для модулей многомодульного проекта. Родительское приложение использует расширение, чтобы связать себя с проектом build-config и получить от него ресурсы. Он используется для переноса общих файлов конфигурации в модули. Это также может быть канал для недвижимости. Вы можете записать верхний каталог в файл свойств, используемый build-config. (кажется слишком сложным)
Проблема в том, что для работы этого многомодульного проекта необходимо добавить новый верхний уровень. Я попытался обойтись без по-настоящему несвязанного проекта конфигурации сборки, но он был непонятным и хрупким.
источник
Это расширяет ответ romaintaz, который отлично решает проблему, а также четко указывает на отсутствующую функциональность maven. Я взял более позднюю версию плагина и добавил случай, когда проект может быть более чем на 3 уровня.
Я решил не использовать свойство для определения имени файла. Обратите внимание, что если build.properties не найден, он будет вращаться вечно. Я добавил обнаружение каталога .git, но не хотел слишком усложнять ответ, поэтому здесь он не показан.
источник
Мне нужно было решить аналогичную проблему для локального репозитория, размещенного в основном проекте многомодульного проекта. По сути, реальный путь был
${basedir}
/ lib. Наконец я остановился на этом в своемparent.pom
:Это
basedir
всегда отображается для текущего локального модуля, нет способа получить путь к «главному» проекту (позор Maven). Некоторые из моих подмодулей на одну директорию глубже, некоторые на две директории глубже, но все они являются прямыми подмодулями родителя, который определяет URL-адрес репо.Так что это не решает проблему в целом. Вы всегда можете объединить его с принятым ответом Клея и определить какое-то другое свойство - работает нормально, и его нужно переопределять только в тех случаях, когда значение from
parent.pom
недостаточно хорошее. Или вы можете просто перенастроить плагин - что вы делаете только в артефактах POM (родительских элементах других подмодулей). Значение, извлеченное в свойство, вероятно, лучше, если оно вам нужно в большем количестве мест, особенно когда ничего не меняется в конфигурации плагина.Использование
basedir
значения было здесь важной частью, потому что URL-адресfile://${project.parent.relativePath}/lib
не помогал (я убрал одну косую черту, чтобы сделать его относительным). Было необходимо использовать свойство, которое дает мне хороший абсолютный путь, а затем перейти от него относительно.Если путь не является URL / URI, это, вероятно, не проблема
basedir
.источник
Я получил доступ к каталогу выше, используя $ {basedir} .. \ src \
источник
sub-module1
он будет указывать на каталогmodule2
, а не наmain-project
.Вы пробовали
../../env_${env}.properties
?Обычно мы делаем следующее, когда module2 находится на том же уровне, что и подмодули
Я думаю, что ../ .. позволит вам прыгнуть на два уровня вверх. Если нет, вы можете связаться с авторами плагина и узнать, известна ли это проблема.
источник