Поиск корневой директории многомодового проекта реактора maven
Я хочу использовать плагин maven-dependency для копирования 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}
в POM-модуле уха, ${basedir}
будет разрешаться на основе ушного модуля.
Кроме того, я нашел http://labs.consol.de/lang/de/blog/maven/project-root-path-in-a-maven-multi-module-project/, где он предположил, что каждый разработчик и, предположительно, сервер непрерывной интеграции должен настроить корневой каталог в профилях. xml, но я не считаю это решением.
Итак, есть ли простой способ найти корень многомодульного проекта?
Ответы
Ответ 1
использовать ${session.executionRootDirectory}
Для записи ${session.executionRootDirectory}
работает для меня в файлах pom в Maven 3.0.3. Это свойство будет каталогом, в котором вы работаете, поэтому запустите родительский проект, и каждый модуль сможет получить путь к этому корневому каталогу.
Я помещаю конфигурацию плагина, которая использует это свойство в родительском помпе, чтобы он унаследовал. Я использую его в профиле, который я выбираю только тогда, когда знаю, что я собираюсь запустить 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>
Ответ 2
Что-то, что я использовал в моих проектах, - это переопределить свойство в подмодульных poms.
root: <myproject.root>${basedir}</myproject.root>
moduleA: <myproject.root>${basedir}/..</myproject.root>
other/moduleX: <myproject.root>${basedir}/../..</myproject.root>
Таким образом, у вас все еще есть относительные пути, но вы можете определить плагин один раз в корневом модуле, и ваши модули наследуют его с помощью правой подстановки для myproject.root.
Ответ 3
Существует плагин maven, который решает эту проблему: directory-maven-plugin
Он назначит корневой путь вашего проекта свойству по вашему выбору. См. Цель 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}
в любом месте вашего родительского/дочернего pom.xml.
Ответ 4
Как утверждали другие, путь к каталогу-maven-plugin - путь.
Тем не менее, я нашел, что он лучше всего работает с целью "directory-of", как описано здесь: fooobar.com/questions/71081/....
Я предпочитаю, что использование high-basedir не работает для меня с многомодульным проектом с вложенными многомодульными порами. Целевая директория позволяет вам установить свойство на путь любого модуля во всем проекте, включая корень, конечно.
Это также лучше, чем ${session.executionRootDirectory}, потому что он всегда работает, независимо от того, создаете ли вы корневой или подмодуль, и независимо от текущего рабочего каталога, в котором вы mvn.
Ответ 5
Я столкнулся с подобной проблемой, так как мне нужно было копировать файлы между проектами. Что Maven делает логично, потому что он сохранит pom.xml, установленный в хранилище, вдали от жесткого кодированного значения.
Мое решение состояло в том, чтобы поместить скопированный каталог в артефакт Maven, а затем использовать Ant для извлечения/копирования
Ответ 6
Я не знаю "хороший" способ найти корень многомодульного проекта. Но вы можете немного улучшить свой нынешний подход.
Первой альтернативой могло бы стать создание дополнительного модуля непосредственно в корневом проекте, чтобы объявить все EAR в качестве зависимостей в нем и использовать dependency:copy-dependencies
скопировать зависимости модуля в каталог to-deploy
(относительно). Да, путь все равно будет относительным, но поскольку конфигурация плагина зависимостей будет централизована, я не считаю это раздражающим.
Второй альтернативой было бы использовать Maven Assembly Plugin вместо Maven Dependency Plugin для создания дистрибутива с использованием формата dir (это создаст дистрибутив в каталоге). Это на самом деле то, что я сделал бы.
Ответ 7
Другим решением было бы использовать задачу ant для записи "rootdir = ${basedir}" в target/root.properties в корневом проекте, а затем использовать Плагин свойств, чтобы прочитать этот файл. Я не пробовал это сам, но я думаю, это должно сработать.?
Ответ 8
Следующий небольшой профиль работал у меня. Мне нужна такая конфигурация для 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
. (Я не знаю, почему в теге проверки должно быть "../.." в теге проверки и просто ".." ), но оно работает только таким образом.)
Ответ 9
так что: где-то в свойствах какого-либо родительского проекта у меня есть файл, который мне нужно связать позже, зачем мне нужен абсолютный путь на нем повсюду. Итак, я получаю его с помощью 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/[email protected]/XE</sonar>
<sonar.jdbc.username>sonar</sonar.jdbc.username>
<format.conf> ${xyz_format}</format.conf> <---- here is it!
</properties>
он работает!