Apache Maven
Создание плагина Maven
Поиск…
Вступление
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;