Apache Maven
Erstellen Sie ein Maven-Plugin
Suche…
Einführung
Mit Maven können Sie benutzerdefinierte Plugins implementieren und verwenden. Mit diesen Plugins kann zusätzliches Verhalten an jede Phase des Maven-Lebenszyklus gebunden werden.
Jedes Maven-Ziel wird erstellt, indem ein MOJO (Maven Ordinary Java Object) implementiert wird: eine mit Annotationen implementierte Java-Klasse, die beschreibt, wie sie aufgerufen wird.
Das Zielpräfix eines Plugins wird von seinem Artefaktnamen abgeleitet. Ein Artefakt- hello-world-plugin
erstellt ein Ziel-Präfix- hello-world
. Das hello
Ziel kann dann mit mvn hello-world:hello
.
Bemerkungen
Ein Maven-Plugin ist eine JAR- maven/plugins.xml
, die eine maven/plugins.xml
, die die Plugin-Metadaten beschreibt. Diese Datei wird vom maven-plugin-plugin
generiert.
Maven-Artefakt als Maven-Plugin deklarieren
Ein von Maven erstelltes Artefakt kann als Maven-Plugin deklariert werden, indem die Verpackung als maven-plugin
in pom.xml
.
<packaging>maven-plugin</packaging>
Sie müssen eine Abhängigkeit von der Plugin-API und den Anmerkungen angeben.
<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>
Sie müssen ein Plugin hinzufügen, um die Metadaten zu generieren.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.5</version>
</plugin>
Ein Ziel schaffen
Ziele werden durch Erstellen eines MOJO implementiert. Dies ist eine Klassendatei, die mit Anmerkungen von maven-plugin-annotations
.
@Mojo(name = "hello")
public final class HelloWorldMojo extends AbstractMojo {
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("Hello world");
}
}
Plugin-Konfiguration verwenden
Plugins können durch Annotieren von Feldern mit @Parameter
konfiguriert werden. Dem MOJO wird dann die Konfiguration injiziert.
@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);
}
}
Der name
Parameter kann im POM konfiguriert werden:
<plugin>
<groupId>com.mattunderscore</groupId>
<artifactId>hello-world-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<name>Matt</name>
</configuration>
</plugin>
Wenn das greet
als eigenständiges Ziel ausgeführt wird, kann der name
Parameter als Eigenschaft in der Befehlszeile definiert werden:
mvn <plugin name>:greet -Dname=Geri
Zugriff auf die Projektinformationen
Das Plugin kann unter anderem auf Informationen zum aktuellen Maven-Projekt zugreifen, das gerade erstellt wird.
@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());
}
}
Das obige Beispiel würde den Namen des Maven-Projekts, auf dem es ausgeführt wird, in der Konsole ausgeben, der im Element <project>/<name>
seines POM angegeben ist.
Die im Plugin verwendete MavenProject
Klasse erfordert eine Abhängigkeit von maven-core
mit einem (Standard-) compile
im POM des Plugins:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>3.3.9</version>
</dependency>
Die Verwendung von Annotationen erfordert außerdem die folgende Abhängigkeit im POM des Plugins:
<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>
Deklarieren Sie eine Standardphase für ein Ziel
@Mojo(name = "hi", defaultPhase = LifecyclePhase.COMPILE)
Holen Sie sich das Build-Verzeichnis als Datei
@Parameter(defaultValue = "${project.build.directory}")
private File buildDirectory;