использование плагина Maven enforcer
Я хотел бы использовать плагин Maven enforcer, чтобы проверить, есть ли у меня дубликаты классов на моем пути. Я пробовал пример из здесь.
но когда я запускаю его так:
mvn enforcer:enforce
Я получаю это:
не удалось выполнить цель орг.апаш.знаток.Плагины:maven-enforcer-плагин: 1.0.1: enforce (по умолчанию-cli) в project datapopulator: параметры "правила" для цель орг.апаш.знаток.Плагины:maven-enforcer-plugin:1.0.1:принудительное исполнение отсутствует или недействителен
есть ли способ использовать это правильно?
правка #1
Если меняю конфиг такой:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.0.1</version>
<executions>
<execution>
<id>enforce-versions</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<AlwaysPass />
</rules>
<fail>true</fail>
</configuration>
</execution>
</executions>
</plugin>
производит ту же ошибку.
4 ответов
причина, по которой ваша первая версия не работала, заключается в том, что существует разница между конфигурацией плагина внутри тега выполнения и конфигурацией плагина вне тега выполнения. Выполнение используется только тогда, когда ваш плагин запускается специальной фазой полной сборки Maven.
на Maven руководство по конфигурации объясняет это лучше:
конфигурации внутри тега отличаются от тех, что снаружи их нельзя использовать из прямого вызова командной строки. Вместо этого они применяются только тогда, когда вызывается фаза жизненного цикла, к которой они привязаны. Кроме того, если вы переместите раздел конфигурации за пределы раздела executions, он будет применяться глобально ко всем вызовам плагина.
попробуйте это, перемещая конфигурацию за пределы выполнения, поэтому она не привязана к фазе жизненного цикла.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.0.1</version>
<executions>
<execution>
<id>enforce-versions</id>
<goals>
<goal>enforce</goal>
</goals>
</execution>
</executions>
<configuration>
<rules>
<AlwaysPass />
</rules>
<fail>true</fail>
</configuration>
</plugin>
теперь, когда ты mvn enforcer:enforce
, он выбирает правила из вашего pom.XML.
посмотреть эти ответы
вы можете использовать специальный идентификатор выполнения командной строки по умолчанию, default-cli для его вызова (см. Maven Docs), см. мой пример ниже. Это работает по крайней мере с 3.1.1, и в приведенной статье говорится, что он должен работать с 2.2.0+
mvn enforcer:enforce
Если вы используете выше Maven 3.1.1 (я могу подтвердить, что он работает в 3.3.3 с enforcer v 1.4.1) вы можете указать идентификатор выполнения, который хотите использовать новый синтаксис @ (см. Maven JIRA и ответы выше);
например, для примера ниже используйте
mvn enforcer:enforce@dependency-convergence
вот фрагмент из моего пом;
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<id>dependency-convergence</id>
<phase>install</phase>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<DependencyConvergence />
</rules>
<fail>true</fail>
</configuration>
</execution>
<execution>
<id>default-cli</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<DependencyConvergence/>
</rules>
<fail>true</fail>
</configuration>
</execution>
</executions>
</plugin>
...
Я не знаю, почему он не будет работать с конфигурацией, находящейся в исполнении, но это сработало для меня:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.0</version>
<configuration>
<rules>
<banDuplicateClasses>
<findAllDuplicates>true</findAllDuplicates>
</banDuplicateClasses>
</rules>
<fail>false</fail>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.mojo</groupId>
<artifactId>extra-enforcer-rules</artifactId>
<version>1.0-alpha-1</version>
</dependency>
</dependencies>
</plugin>