Ответ 1
Вам нужно добавить файл META-INF/plexus/components.xml
в свой плагин и установить <extensions>true</extensions>
в свой блок плагинов.
См. 11.6.3. Переопределение жизненного цикла по умолчанию из книги Maven для справки
Я написал плагин, который генерирует один файл в target/generated-sources/. Этот плагин содержит только один mojo. Этот mojo объявляется следующим образом:
/**
* @goal convertsql
* @phase generate-sources
* @requiresProject
*/
public class ConverterMojo extends AbstractMojo {
В проекте я хочу использовать плагин, но он не работает, если я не указываю тег выполнения:
<executions>
<execution>
<id>convert</id>
<goals><goal>convertsql</goal></goals>
<phase>generate-sources</phase>
</execution>
</executions>
Я хотел бы только настроить плагин следующим образом:
<plugin>
<groupId>com.my.plugins</groupId>
<artifactId>sqlconverter</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<sourceFile>src/main/resources/sql/schema_oracle.sql</sourceFile>
</configuration>
</plugin>
Можно ли указать mojo по умолчанию для моего плагина? Цель и фаза по умолчанию определены в mojo... Я имею в виду, что при использовании плагина jar мне не нужно указывать цель, которую я хочу выполнить, на какой фазе... она автоматическая.
Спасибо!
Вам нужно добавить файл META-INF/plexus/components.xml
в свой плагин и установить <extensions>true</extensions>
в свой блок плагинов.
См. 11.6.3. Переопределение жизненного цикла по умолчанию из книги Maven для справки
Когда ваш плагин Maven автоматически запускает свою цель по умолчанию, когда его фаза по умолчанию выполняется, невозможно. Это сбивает с толку, потому что есть много стандартных привязок плагинов для конкретных упаковок. Они определены в ядре Maven: https://maven.apache.org/ref/3.6.1/maven-core/default-bindings.html.
Например, для упаковки WAR это:
<phases>
<process-resources>
org.apache.maven.plugins:maven-resources-plugin:2.6:resources
</process-resources>
<compile>
org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
</compile>
<process-test-resources>
org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
</process-test-resources>
<test-compile>
org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
</test-compile>
<test>
org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
</test>
<package>
org.apache.maven.plugins:maven-war-plugin:2.2:war
</package>
<install>
org.apache.maven.plugins:maven-install-plugin:2.4:install
</install>
<deploy>
org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
</deploy>
</phases>
Определяя фазу по умолчанию в вашем плагине, вам не нужно указывать это, только цель. В твоем случае:
<executions>
<execution>
<id>convert</id>
<!--
Not needed for default phase of plugin goal:
<phase>generate-sources</phase>
-->
<goals>
<goal>convertsql</goal>
</goals>
</execution>
</executions>
Также см. Https://maven.apache.org/developers/mojo-api-specification.html (ищите @phase
). Соответствующая цитата (мой акцент):
Определяет фазу по умолчанию для привязки выполнения mojo, если пользователь явно не устанавливает фазу в POM. Примечание. Эта аннотация не будет автоматически запускать mojo при добавлении объявления плагина в POM. Это просто позволяет пользователю опустить элемент из окружающего элемента.