Подтвердить что ты не робот

Как определить mojo по умолчанию для плагина 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 мне не нужно указывать цель, которую я хочу выполнить, на какой фазе... она автоматическая.

Спасибо!

4b9b3361

Ответ 2

Когда ваш плагин 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. Это просто позволяет пользователю опустить элемент из окружающего элемента.