Поиск…


Вступление

Maven позволяет реализовать и использовать пользовательские плагины. Эти плагины позволяют связать дополнительное поведение с любой фазой жизненного цикла Maven.

Каждая цель Maven создается путем реализации MOJO (Maven Ordinary Java Object): класс Java, реализованный с аннотациями, который описывает, как его вызывать.

Префикс цели плагина основан на его имени артефакта. Артефакт hello-world-plugin создает префикс цели hello-world . Тогда цель hello можно запустить с помощью mvn hello-world:hello .

замечания

Плагин Maven - это JAR, содержащий maven/plugins.xml который описывает метаданные плагина. Этот файл создается maven-plugin-plugin .

Объявление артефакта Maven как плагина Maven

Артефакт, созданный Maven, можно объявить как плагин Maven, указав упаковку как maven-plugin в pom.xml .

<packaging>maven-plugin</packaging>

Вам нужно объявить зависимость от API-интерфейса плагина и аннотаций.

<dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-plugin-api</artifactId>
    <version>3.3.9</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.apache.maven.plugin-tools</groupId>
    <artifactId>maven-plugin-annotations</artifactId>
    <version>3.5</version>
    <scope>provided</scope>
</dependency>

Вам нужно добавить плагин для генерации метаданных.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-plugin-plugin</artifactId>
    <version>3.5</version>
</plugin>

Создание цели

Цели реализуются путем создания MOJO. Это файл класса, аннотированный аннотациями из аннотаций maven-plugin-annotations .

@Mojo(name = "hello")
public final class HelloWorldMojo extends AbstractMojo {

    public void execute() throws MojoExecutionException, MojoFailureException {
         getLog().info("Hello world");
    }
}

Использование конфигурации плагина

Плагины могут быть настроены путем аннотирования полей с помощью @Parameter . Затем MOJO вводится в конфигурацию.

@Mojo(name = "greet")
public final class GreetMojo extends AbstractMojo {

    @Parameter(required = true)
    public String name;

    public void execute() throws MojoExecutionException, MojoFailureException {
        getLog().info("Hello " + name);
    }
}

Параметр name можно настроить в POM:

<plugin>
    <groupId>com.mattunderscore</groupId>
    <artifactId>hello-world-plugin</artifactId>
    <version>1.0-SNAPSHOT</version>
    <configuration>
        <name>Matt</name>
    </configuration>
</plugin>

Если цель greet выполняется как отдельная цель, параметр name может быть определен как свойство в командной строке:

mvn <plugin name>:greet -Dname=Geri

Доступ к информации о проекте

Плагин может, среди прочего, получать доступ к информации о текущем проекте Maven.

@Mojo(name = "project")
public final class ProjectNameMojo extends AbstractMojo {

    @Parameter(defaultValue = "${project}", readonly = true, required = true)
    private MavenProject project;

    public void execute() throws MojoExecutionException, MojoFailureException {
        getLog().info("Hello, this is " + project.getName());
    }
}

В приведенном выше примере будет отображаться в консоли имя проекта Maven, на котором он запущен, который указан в элементе <project>/<name> его POM.

Класс MavenProject используемый в плагине, требует зависимости maven-core с областью compile (по умолчанию) в POM плагина:

<dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-core</artifactId>
    <version>3.3.9</version>
</dependency>

Кроме того, использование аннотаций требует следующей зависимости в POM плагина:

<dependency>
  <groupId>org.apache.maven.plugin-tools</groupId>
  <artifactId>maven-plugin-annotations</artifactId>
  <version>3.5</version>
  <scope>provided</scope> <!-- annotations are needed only to build the plugin -->
</dependency>

Объявить этап по умолчанию для цели

@Mojo(name = "hi", defaultPhase = LifecyclePhase.COMPILE)

Получить каталог сборки как файл

@Parameter(defaultValue = "${project.build.directory}")
private File buildDirectory;


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow