Разница с Checkstyle и конфигурацией PMD в родительском модуле maven

У меня есть Java-приложение с Maven, имеющий структуру ниже:

parent
| - pom.xml
| - child
    | - pom.xml
| - analyzers
    | - pmdrules.xml
    | - checkstyle.xml

Я настроил оба PMD и checkstyle в родительском pom.xml. Для PMD наборы правил настраиваются, как показано ниже, и отлично работает как для родительских, так и для дочерних модулей:

<configuration>
    <rulesets>
        <ruleset>${basedir}/../analyzers/pmdrules.xml</ruleset>
    </rulesets>
</configuration>

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

<configuration>
    <!-- Below config with ${projectRootDir}, a custom property always pointing to parent root works fine -->
    <configLocation>${projectRootDir}/analyzers/checkstyle.xml</configLocation>
    <!-- Below configurations with ${basedir} will fail build for child -->
    <!--<configLocation>${basedir}/analyzers/checkstyle.xml</configLocation>-->
    <!-- Below configurations with ${basedir} will fail build for parent -->
    <!--<configLocation>${basedir}/../analyzers/checkstyle.xml</configLocation>-->
</configuration>

Вот пример репродуктора: https://github.com/ramtech123/pocs/blob/master/myapp-parent-module/pom.xml

Я попытался запустить сборку Maven в режиме отладки. Из журналов мне кажется, что фактическое выполнение PMD происходит только для дочернего модуля, следовательно, оно проходит без проблем.

Может ли кто-нибудь помочь мне понять основную причину и улучшить мою конфигурацию.

Заранее спасибо.

1 ответ

Решение

Когда вы создаете ребенка pom.xml он наследует свою родительскую конфигурацию, но такие свойства как baseDir переопределяются дочерними, поэтому он использует свой собственный путь при настройке конфигурации вашего плагина.

Как вариант вы можете просто оставить <configLocation>analyzers/checkstyle.xml</configLocation> без {baseDir} или же {projectRootDir}работает нормально.

Однако ваше решение также хорошо, как вы указываете projectRootDir в родительском корне, и он там оценивается, и дочерний pom не переопределяет ваше пользовательское свойство, поэтому оно корректно.

Ваш pmd всегда работает, потому что плагин pmd работает только для дочернего модуля.

Другие вопросы по тегам