Как подключить плагин maven к фазе по умолчанию?
У меня есть плагин maven, который должен запускаться на этапе компиляции, поэтому в проекте, который потребляет мой плагин, я должен сделать что-то вроде этого:
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>my-goal</goal>
</goals>
</execution>
</executions>
Мне нужно, чтобы по умолчанию прикрепить my-goal
к фазе компиляции, если пользователь уже включил мой плагин (в идеале вышеуказанная часть не нужна, просто объявление плагина).
Возможно ли это?
Ответы
Ответ 1
Добавьте аннотацию @phase
в аннотации классов Mojo.
Док говорит:
@phase <phaseName>
Эта аннотация определяет фазу по умолчанию для этой цели. Если вы добавите выполнение для этой цели в pom.xml и не укажете фазу, Maven привяжет цель к фазе, указанной в этой аннотации по умолчанию.
Если это не сработает, я думаю, что JIRA гарантируется.
Ответ 2
Создайте экземпляр src\main\resources\META-INF\plexus\components.xml в вашем плагине.
В нем создается сопоставление LifeCycle для типов артефактов, которые вы хотите поддержать Mojo. Убедитесь, что в нем перечислены все фазы и плагины, которые вы хотите поддерживать. Вероятно, лучше всего скопировать из файла maven-core.jar.
Затем добавьте свой плагин в соответствующий жизненный цикл на этапе, на котором вы хотите, чтобы они были построены.
Например, consume-aar Mojo добавлен в фазу скомпилировать жизненного цикла aar.
<!-- Android archive (aar) support -->
<component>
<role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
<role-hint>aar</role-hint>
<implementation>
org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping
</implementation>
<configuration>
<phases>
<generate-sources>
com.jayway.maven.plugins.android.generation2:android-maven-plugin:generate-sources
</generate-sources>
<process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
<compile>
com.jayway.maven.plugins.android.generation2:android-maven-plugin:consume-aar,
org.apache.maven.plugins:maven-compiler-plugin:compile
</compile>
Ответ 3
Это возможно, но это недокументированная функция maven.
Используйте этот components.xml
:
<component-set>
<components>
<component>
<role>org.apache.maven.lifecycle.Lifecycle</role>
<implementation>org.apache.maven.lifecycle.Lifecycle</implementation>
<role-hint>myplugin</role-hint>
<configuration>
<id>accurest</id>
<phases>
<phase>my-plugin-not-used-phase</phase>
</phases>
<default-phases>
<compile>
my.package:my-plugin:${project.version}:my-goal
</compile>
</default-phases>
</configuration>
</component>
</components>
но ваш плагин необходимо добавить с помощью <extensions>true</extensions>
для изменения существующего жизненного цикла.
Подробнее: Как привязать плагины mojos (цели) к нескольким этапам жизненного цикла по умолчанию?
Реальный проект: https://github.com/spring-cloud/spring-cloud-contract/blob/master/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/resources/META-INF/plexus/components.xml
Ответ 4
Вы связываете плагин с maven lifecyle цель. Конфигурация плагина должна быть объявлена в фазе.
Например, если вы хотите запустить некоторый плагин во время фазы сборки, вам нужно сделать что-то вроде этого:
<project>
...
...
<build>
<plugin>
**Configuration of plugin**
</plugin>
</build>
</project>
Пожалуйста, внимательно прочитайте о жизненных циклах maven (это важно для понимания maven):
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
И затем прочитайте о том, как настроить плагин: http://maven.apache.org/guides/mini/guide-configuring-plugins.html
P.S. Входить в логику maven нелегко вначале. Но это вознаграждение впоследствии.