Вложенные свойства Maven оцениваются при обращении к POM, а не при определении POM - PullRequest
7 голосов
/ 21 января 2009

Я определяю конфигурацию отчета в родительском модуле, который будет запускаться в каждом проекте для детей и внуков.

Вроде так:

<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>1.2</version>
            <configuration>
                <xmlOutput>true</xmlOutput>
                <threshold>Low</threshold>
                <effort>Min</effort>
                <includeFilterFile>${basedir}/findbugsFilter.xml</includeFilterFile>
            </configuration>
        </plugin>
    </plugins>
</reporting>

Проблема в том, что каждый дочерний элемент вводит свой basedir, а не определяющий POM. Я полагаю, что я ищу эквивалент ANT <property name="name" location="${basedir}"/>.

Ответы [ 4 ]

6 голосов
/ 06 мая 2009

Краткая версия: Решение вашей проблемы описано в документации findbugs-maven-plugin . Вам просто нужно создать отдельный проект (верхнего уровня) для конфигурации сборки, который содержит ваш findbugsFilter.xml и ссылаться на этот проект как на зависимость.

Длинная версия: Доступ к ресурсам из родительских или родственных проектов в Maven, к сожалению, немного сложен. Причина этого: при создании дочернего проекта Maven не может предположить, что родительский модуль находится на один уровень выше, или проект одного уровня находится на том же уровне в файловой системе. На самом деле, он не может предположить, что какой-либо из этих проектов где-то был проверен! Совершенно законно только проверить один дочерний проект и построить его как есть. Таким образом, при сборке с Maven все (за очень немногими исключениями) загружается из вашего локального репозитория. И именно поэтому вы должны создавать отдельные проекты для ресурсов, которые вы хотите использовать в нескольких модулях. Затем отдельный проект можно добавить в качестве зависимости и использовать несколько различных плагинов Maven. Примеры: checkstyle и плагины findbugs для чтения конфигурационных файлов, maven-dependency-plugin для копирования внешних файлов в ваши артефакты или properties-maven-plugin для загрузки внешних файлов свойств.

4 голосов
/ 26 июня 2009

У меня была похожая проблема, когда я хотел, чтобы у дочерних POM был тот же файл свойств, что и у родительского, но я не мог заставить работать переменную $ {project.parent.basedir}.

Однако я создал переменную в родительском элементе и переписал одну и ту же переменную в каждом из дочерних пом (это должно работать и для бабушек ... хотя у меня их не было).

Например:

Parent POM:
    <properties>
        <my_basedir>${basedir}</my_basedir>
    </properties>


Child POMs:
    <properties>
        <my_basedir>${basedir}/../</my_basedir>
    </properties>

Теперь я просто перечисляю фильтр один раз в родительском, и все остальные получают его. Если вы перемещаете ребенка, вы просто меняете относительный путь.

   <filters>
       <filter>${my_basedir}/myfile.properties</filter>
   </filters>
0 голосов
/ 21 января 2009

Это связано с другим вашим вопросом .

Вы отказались от идеи развертывания файла фильтра в отдельном артефакте? Почему?

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

Вы пробовали мое предложение на другой вопрос?

0 голосов
/ 21 января 2009

Я не уверен, что это может решить вашу проблему, но у меня есть две идеи, которые вы можете попробовать:

1-я идея

Определите свойство в родительском pom и используйте его в конфигурации отчета:

<properties>
    <parent-basedir>${basedir}</parent-basedir>
</properties>
...
<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>1.2</version>
            <configuration>
                <xmlOutput>true</xmlOutput>
                <threshold>Low</threshold>
                <effort>Min</effort>
                <includeFilterFile>${parent-basedir}/findbugsFilter.xml</includeFilterFile>
            </configuration>
        </plugin>
    </plugins>
</reporting>

2-я идея

Другая идея заключается в использовании $ {project.parent.basedir}:

...
<includeFilterFile>${project.parent.basedir}/findbugsFilter.xml</includeFilterFile>
...
...