Подтвердить что ты не робот

Переменная Maven для корня реакторов

В мультимодульном проекте maven есть ли переменная, указывающая на корневую папку проекта?

  • ${project.basedir} указывает на текущий каталог проекта,
  • ${project.parent.basedir} указывает на родительский каталог проекта,

но есть ли переменная, которая всегда указывает на корневой каталог (тот, из которого была выполнена команда maven), независимо от того, какой проект внутри реактора?


Я понял, что проблема, которую я хотел решить, в значительной степени неразрешима. Мне нужна переменная, указывающая на project.basedir, project.parent.basedir, project.parent.parent.basedir и т.д., В зависимости от того, что больше. Но поскольку родительский pom проекта не обязательно должен быть родителем в файловой системе, мой подход не поможет. Поэтому я принимаю Pascal ответ, потому что он отвечает на мой вопрос (даже если мой вопрос не решает мою проблему).

4b9b3361

Ответ 1

есть переменная, которая всегда указывает на корневой каталог (тот, из которого была выполнена команда maven)

user.dir (рабочий каталог) должен быть этим каталогом.

Ответ 2

В Maven 3, ${session.executionRootDirectory} - это "переменная, которая всегда указывает на каталог..., из которого была выполнена команда maven".

Обратите внимание, что это отличается от свойства, которое дает корневую директорию верхнего уровня многомодульного проекта, независимо от того, где выполняется структура mvn. Насколько мне известно, такого свойства не существует, но вы можете использовать взломать ${basedir}/.. для его достижения. Подробнее см. этот поток на maven-users.

См. также: Поиск корневого каталога многоблочного проекта реактора maven

Ответ 3

Такое свойство может быть создано с помощью: directory-maven-plugin. Используя цель плагина highest-basedir, вы можете назначить корневой путь любому указанному вам свойству.

Ответ 4

Используйте каталог-maven-plugin с каталогом цели.

В отличие от других предложений:

  • Это решение работает для многомодульных проектов.
  • Он работает, строите ли вы весь проект или подмодуль
  • Он работает независимо от того, запускаете ли вы maven из корневой папки или подмодуля (в отличие от ${session.executionRootDirectory}
  • Не нужно устанавливать свойство относительного пути в каждом подмодуле!

Плагин позволяет вам установить свойство по вашему выбору на абсолютный путь любого из модулей проекта. В моем случае я установил его в корневой модуль... В моем проекте 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 всегда имеет путь к корневому модулю проекта. И, конечно же, вы можете установить свойство для любого модуля, а не только из корня...

Ответ 6

Для меня возникла необходимость в корневом каталоге во время интерполяции переменных, а не в разделе плагинов - для локального каталога по отношению к корню с помощью ручных инструментов. Я знаю, что это плохая практика иметь локальный каталог с банками, но это было требованием проекта.

Почему мне не удалось использовать разные решения:

  • ${session.executionRootDirectory} и ${user.dir} связаны с каталогом, из которого была выполнена команда maven. Я хочу ссылаться на тот же каталог независимо от каталога, из которого был запущен maven.
  • ${project.basedir}, как упоминалось выше, указывает на текущий каталог проекта, поэтому дочерние модули будут искать банки в неправильном месте.
  • У меня было около 100 проектов, поэтому определение относительных путей или использование принятого ответа для этого вопроса довольно сложно в моем случае.
  • Плагин каталога может использоваться только для конфигураций плагинов, а не для переменной интерполяции

Итак, в моем случае с плохими требованиями я использовал переменную среды, которая ссылается на корень проекта и использует его в pom.xml. Используйте его как последнее средство, когда другие решения не работают. Вот пример, как я использую переменную среды в моем случае:

<repositories>
    <repository>
        <id>local-maven-repo</id>
        <!--NOTE: export PROJECT_ROOT=<location>-->
        <url>file:///${env.PROJECT_ROOT}/local-repo</url>
    </repository>
</repositories>