Ответ 1
есть переменная, которая всегда указывает на корневой каталог (тот, из которого была выполнена команда maven)
user.dir
(рабочий каталог) должен быть этим каталогом.
В мультимодульном проекте maven есть ли переменная, указывающая на корневую папку проекта?
${project.basedir}
указывает на текущий каталог проекта,${project.parent.basedir}
указывает на родительский каталог проекта,но есть ли переменная, которая всегда указывает на корневой каталог (тот, из которого была выполнена команда maven), независимо от того, какой проект внутри реактора?
Я понял, что проблема, которую я хотел решить, в значительной степени неразрешима. Мне нужна переменная, указывающая на project.basedir, project.parent.basedir, project.parent.parent.basedir и т.д., В зависимости от того, что больше. Но поскольку родительский pom проекта не обязательно должен быть родителем в файловой системе, мой подход не поможет. Поэтому я принимаю Pascal ответ, потому что он отвечает на мой вопрос (даже если мой вопрос не решает мою проблему).
есть переменная, которая всегда указывает на корневой каталог (тот, из которого была выполнена команда maven)
user.dir
(рабочий каталог) должен быть этим каталогом.
В Maven 3, ${session.executionRootDirectory}
- это "переменная, которая всегда указывает на каталог..., из которого была выполнена команда maven".
Обратите внимание, что это отличается от свойства, которое дает корневую директорию верхнего уровня многомодульного проекта, независимо от того, где выполняется структура mvn
. Насколько мне известно, такого свойства не существует, но вы можете использовать взломать ${basedir}/..
для его достижения. Подробнее см. этот поток на maven-users.
См. также: Поиск корневого каталога многоблочного проекта реактора maven
Такое свойство может быть создано с помощью: directory-maven-plugin.
Используя цель плагина highest-basedir
, вы можете назначить корневой путь любому указанному вам свойству.
Используйте каталог-maven-plugin с каталогом цели.
В отличие от других предложений:
Плагин позволяет вам установить свойство по вашему выбору на абсолютный путь любого из модулей проекта. В моем случае я установил его в корневой модуль... В моем проекте root pom:
<plugin>
<groupId>org.commonjava.maven.plugins</groupId>
<artifactId>directory-maven-plugin</artifactId>
<version>0.1</version>
<executions>
<execution>
<id>directories</id>
<goals>
<goal>directory-of</goal>
</goals>
<phase>initialize</phase>
<configuration>
<property>myproject.basedir</property>
<project>
<groupId>com.my.domain</groupId>
<artifactId>my-root-artifact</artifactId>
</project>
</configuration>
</execution>
</executions>
</plugin>
С этого момента ${myproject.basedir} в любом подмодуле pom всегда имеет путь к корневому модулю проекта. И, конечно же, вы можете установить свойство для любого модуля, а не только из корня...
Насколько я думаю, такой переменной нет. Есть только обходной путь, как в принятом ответе свойства Maven2, который указывает родительский каталог.
Для меня возникла необходимость в корневом каталоге во время интерполяции переменных, а не в разделе плагинов - для локального каталога по отношению к корню с помощью ручных инструментов. Я знаю, что это плохая практика иметь локальный каталог с банками, но это было требованием проекта.
Почему мне не удалось использовать разные решения:
${session.executionRootDirectory}
и ${user.dir}
связаны с каталогом, из которого была выполнена команда maven. Я хочу ссылаться на тот же каталог независимо от каталога, из которого был запущен maven.${project.basedir}
, как упоминалось выше, указывает на текущий каталог проекта, поэтому дочерние модули будут искать банки в неправильном месте.Итак, в моем случае с плохими требованиями я использовал переменную среды, которая ссылается на корень проекта и использует его в pom.xml. Используйте его как последнее средство, когда другие решения не работают. Вот пример, как я использую переменную среды в моем случае:
<repositories>
<repository>
<id>local-maven-repo</id>
<!--NOTE: export PROJECT_ROOT=<location>-->
<url>file:///${env.PROJECT_ROOT}/local-repo</url>
</repository>
</repositories>