Поиск корневого каталога многомодульного проекта Maven reactor
Я хочу использовать плагин Maven-dependency-plugin для копирования EAR-файлов из всех подмодулей моего многомодульного проекта в каталог, который относится к корневому каталогу всего проекта.
то есть мой макет выглядит примерно так, имена изменены:
to-deploy/
my-project/
ear-module-a/
ear-module-b/
more-modules-1/
ear-module-c/
ear-module-d/
more-modules-2/
ear-module-e/
ear-module-f/
...
и я хочу, чтобы все EAR-файлы были скопированы из целевых каталогов их соответствующих модулей в my-project/../to-deploy
так что я в конечном итоге с
to-deploy/
ear-module-a.ear
ear-module-b.ear
ear-module-c.ear
ear-module-d.ear
ear-module-e.ear
ear-module-f.ear
my-project/
...
я мог бы сделать это с относительным путем в каждом ухо-модуль, вот так:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>install</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<type>ear</type>
<outputDirectory>../../to-deploy</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
но я бы предпочел не указывать относительный путь в <outputDirectory>
элемент.
Я бы предпочел что-то вроде ${reactor.root.directory}/../to-deploy
, но я не могу найти ничего подобного.
кроме того, я бы предпочел, чтобы был какой-то способ наследовать эту конфигурацию Maven-dependency-plugin, поэтому мне не нужно указывать ее для каждого модуля EAR.
Я также попытался наследовать пользовательское свойство от корневого pom:
<properties>
<myproject.root>${basedir}</myproject.root>
</properties>
но когда я попытался использовать ${myproject.root}
в уха-модуль пом х,${basedir}
разрешил бы к basedir ухо-модуля.
кроме того, я нашел http://labs.consol.de/lang/de/blog/maven/project-root-path-in-a-maven-multi-module-project/ где предполагается, что каждый разработчик и предположительно сервер непрерывной интеграции должны настроить корневой каталог в профилях.XML-файл, но я не считаю это решением.
так есть ли простой способ найти корень мульти-модуля проект?
10 ответов:
начиная с Maven 3.3.1, вы можете использовать
${maven.multiModuleProjectDirectory}
для этой цели. (спасибо https://stackoverflow.com/a/48879554/302789)edit: это, кажется, работает только правильно, когда у вас есть
.mvn
папку в корне вашего проекта.
использовать
${session.executionRootDirectory}
для сведения,
${session.executionRootDirectory}
работает для меня в POM-файлах в Maven 3.0.3. Это свойство будет каталог, в котором вы работаете, поэтому запустите Родительский проект, и каждый модуль может получить путь к этому корневому каталогу.я помещаю конфигурацию плагина, которая использует это свойство, в родительский pom, чтобы он наследовался. Я использую его в профиле, который я выбираю только тогда, когда знаю, что собираюсь запустить Maven в Родительском проекте. Таким образом, это менее вероятно, что Я буду использовать эту переменную нежелательным образом, когда я запускаю Maven в дочернем проекте (потому что тогда переменная не будет путем к родительскому).
например,
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-artifact</id> <phase>package</phase> <goals> <goal>copy</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>${project.groupId}</groupId> <artifactId>${project.artifactId}</artifactId> <version>${project.version}</version> <type>${project.packaging}</type> </artifactItem> </artifactItems> <outputDirectory>${session.executionRootDirectory}/target/</outputDirectory> </configuration> </execution> </executions> </plugin>
что-то, что я использовал в своих проектах, чтобы переопределить свойство в субмодуле poms.
root: <myproject.root>${basedir}</myproject.root> moduleA: <myproject.root>${basedir}/..</myproject.root> other/moduleX: <myproject.root>${basedir}/../..</myproject.root>
таким образом, у вас все еще есть относительные пути, но вы можете определить плагин один раз в корневом модуле, и ваши модули наследуют его с правильной заменой для myproject.корень.
есть плагин maven, который решает эту конкретную проблему:каталог-maven-плагин
он назначит корневой путь вашего проекта свойству по вашему выбору. Смотрите
highest-basedir
цель в документации.например:
<!-- Directory plugin to find parent root directory absolute path --> <plugin> <groupId>org.commonjava.maven.plugins</groupId> <artifactId>directory-maven-plugin</artifactId> <version>0.1</version> <executions> <execution> <id>directories</id> <goals> <goal>highest-basedir</goal> </goals> <phase>initialize</phase> <configuration> <property>main.basedir</property> </configuration> </execution> </executions> </plugin>
затем использовать
${main.basedir}
в любом месте вашего родителя / ребенка пом.XML.
Как предлагали другие, каталог-maven-плагин-это путь. Однако я обнаружил, что он лучше всего работает с целью "каталог-of", как описано здесь:https://stackoverflow.com/a/37965143/6498617.
Я предпочитаю, чтобы использование highest-basedir не работало для меня с многомодульным проектом, с вложенными многомодульными poms. Каталог-цели позволяет установить свойство к пути любого модуля во всем проекте, включая корень, конечно. Это тоже путь лучше, чем $ {сессия.executionRootDirectory}, потому что он всегда работает, независимо от того, создаете ли вы корень или подмодуль, и независимо от текущего рабочего каталога, из которого вы mvn.
Я столкнулся с подобной проблемой, поскольку мне нужно было скопировать файлы между проектами. То, что делает Maven, логично, потому что он будет держать pom.xml установлен в репозитории вдали от жестко закодированного значения.
мое решение состояло в том, чтобы поместить скопированный dir в артефакт Maven, а затем использовать Ant для извлечения/копирования
Я не знаю о "хорошем" способе найти корень многомодульного проекта. Но вы можете немного улучшить свой текущий подход.
первым вариантом было бы создать дополнительный модуль непосредственно под корневым проектом, объявить все уши как зависимости в нем и использовать
dependency:copy-dependencies
чтобы скопировать зависимости модуля в
другим решением было бы использовать задачу ant для записи "rootdir=${basedir}" в цель/корень.свойства в корневом проекте, а затем использовать Плагин Свойства читать этот файл обратно. Я сам не пробовал, но думаю, что это должно сработать..?
следующий небольшой профиль работал для меня. Мне нужна была такая конфигурация для CheckStyle, которую я вставил в
config
каталог в корне проекта, поэтому я могу запустить его из основного модуля и из подмодулей.<profile> <id>root-dir</id> <activation> <file> <exists>${project.basedir}/../../config/checkstyle.xml</exists> </file> </activation> <properties> <project.config.path>${project.basedir}/../config</project.config.path> </properties> </profile>
он не будет работать для вложенных модулей, но я уверен, что его можно изменить для этого, используя несколько профилей с разными
exists
' s. (Я понятия не имею, почему там должно быть "../.."в теге проверки и просто".."в самом переопределенном свойстве, но это работает только таким образом.)
Так что: где-то в свойствах какого-то родительского проекта у меня есть файл, который мне нужно связать позже, поэтому мне нужен абсолютный путь на нем везде. Итак, я получаю его с помощью в Groovy:
<properties> <source> import java.io.File; String p =project.properties['env-properties-file']; File f = new File(p); if (!f.exists()) { f = new File("../" + p); if (!f.exists()) { f = new File("../../" + p); } } // setting path together with file name in variable xyz_format project.properties['xyz_format'] =f.getAbsolutePath() + File.separator + "abc_format.xml"; </source> </properties>
и затем:
<properties> <snapshots>http://localhost:8081/snapshots<snapshots> <releases>http://localhost:8081/releases</releases> <sonar>jdbc:oracle:thin:sonar/sonar@localhost/XE</sonar> <sonar.jdbc.username>sonar</sonar.jdbc.username> <format.conf> ${xyz_format}</format.conf> <---- here is it! </properties>
это работает!